home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-03 / qbs-0101.zip / QBS-0101.DOC < prev    next >
Text File  |  1993-01-04  |  218KB  |  6,110 lines

  1. ------------------------------------------------------------------------
  2.   The QuickBASIC Scrapbook                                    QUIK_BAS
  3.  
  4.   Vol 1, Issue 1                                          January 1993
  5. ------------------------------------------------------------------------
  6.  
  7.           QuickBASIC Scrapbook is produced by Quantum Software
  8.                    (C)Copyright 1993 by Lee Madajczyk
  9.                       Licensed to Quantum Software
  10.  
  11.  
  12.        *** ALL INFORMATION CONTAINED IN THE QUICKBASIC SCRAPBOOK
  13.            IS PUBLIC DOMAIN. ALL INFORMATION COMPILED IN THIS 
  14.            SCRAPBOOK WAS ORIGINALLY POSTED ON THE QUIK_BAS ECHO, 
  15.            FIDO-NET SYSTEMS. DATE, TIME, AND AUTHOR'S NAME HAVE
  16.            BEEN PRESERVED.
  17.  
  18.  
  19.  
  20.  
  21.        Special thanks to all those who have contributed or have
  22.            a published letter or reply. Without your help, this
  23.            would not have been possible.
  24.  
  25.  
  26. ------------------------------------------------------------------------
  27.   The QuickBASIC Scrapbook                                  
  28.                                                             
  29.   Vol 1, Issue 1                                            January 1993
  30. ------------------------------------------------------------------------
  31.                            Editor's Article
  32.  
  33.    Welcome to The QuickBASIC Scrapbook! QBS is a publication devoted
  34.  to providing you with the most up-to-date information available, by
  35.  using the QUIK_BAS echo of FidoNet and compiling important messages
  36.  and programs posted in QUIK_BAS echo. Quantum Software distribution
  37.  sites are listed in the file DISTSITE.QS. If you would like to 
  38.  become a distribution site, please see SITE_APP.QS. Thank you for 
  39.  your co-operation. Due to a time crunch, I cannot provide an index
  40.  or table of contents. One will be included in the nest issue. An
  41.  index for this issue may also be distributed with the next issue.
  42.  Remember! A disk subscription is available for only $19.95! This
  43.  subscription not only gives you the normal six issues ONE WEEK 
  44.  ahead of BBS releases, but gives you a special seventh issue not
  45.  released to the public. Subscription information can be found in
  46.  the SUBSCRBE.QBS file. 
  47.    
  48.    This Month: Rich Geldreich's PC-Speaker MOD player, registration
  49.       encoding, errorlevel reading, loading PCX files, existing file
  50.       check, and more!
  51.  
  52.    Thank you for getting this file!
  53.  
  54.  Contact Information:
  55.  
  56.  U.S. Mail                          Netmail:
  57.     Quantum Software                   Lee Madajczyk
  58.     Lee Madajczyk                      Infinity (1:280/5)
  59.     8012 Cottonwood                    
  60.     Lenexa, KS  66215-4165             (816)761-0860
  61.     ATTN: QB Scrapbook                 Kansas City, MO
  62.  
  63.  
  64. ------------------------------------------------------------------------
  65.   The QuickBASIC Scrapbook                                        
  66.                                                             
  67.   Vol 1, Issue 1                                            January 1993
  68. ------------------------------------------------------------------------
  69.                      P r o d u c t   R e v i e w
  70.                               
  71.                               UI4QB
  72.  
  73.   UI4QB is the ultimate in user interfaces! After reviewing the program
  74.   for only a few days, I must say it is nothing short of impressive. Of
  75.   course, I did register the program back in August, but I thought that
  76.   it would be best to review it for you anyway. Microsoft originally 
  77.   made the program, but it was for the PDS system. Author William Cobb
  78.   then redeveloped the program and set it up for use with QuickBASIC. 
  79.   I have called Microsoft many times and they assured me that William
  80.   Cobb's switching between languages and releasing the program is 
  81.   completely legal. The number for you to call is (800) 426-9400. Press
  82.   (2) for Developer's Assistance. I am assuming that you are at least
  83.   halfway familiar with the QuickBASIC interface. Cobb's UI4QB can make
  84.   you program use menus that look just like QB's. You can also
  85.   
  86.             * Change colors of the menus
  87.  
  88.             * Open multiple, moving windows
  89.  
  90.             * Use built-in mouse support
  91.  
  92.             * Supports B/W and EGA / VGA systems
  93.  
  94.             * Interface with the DOS directories
  95.  
  96.             * Pop up option boxes, shadowed boxes
  97.  
  98.             * More!
  99.  
  100.    The only problem I had with UI4QB was reading the manual. The manual
  101.    can stand a little refinement, but as it stands it is fine. Seasoned
  102.    programmers can easily pick up on the variables, while the newer 
  103.    people may have trouble. At first. You get use to it. Trust me. I 
  104.    should know. The author is rumored to be working on a new release.
  105.    The registration price? Only 15 dollars. The current version is
  106.    UI4QB 1.1a, and can be F'REQed from:
  107.  
  108.       Infinity  (816)761-0860                (1:280/5)
  109.  
  110.                         Filename:  UI4QB11A.*
  111.  
  112.  
  113. ------------------------------------------------------------------------
  114.   The QuickBASIC Scrapbook                                  
  115.                                                             
  116.   Vol 1, Issue 1                                            January 1993
  117. ------------------------------------------------------------------------
  118. ═════════════════════════════════════════════════════════════════════
  119.  Area:    QuickBasic
  120.   Msg:    #19212
  121.  Date:    12-05-92 12:47 (Public) 
  122.  From:    JOHN GALLAS              
  123.  To:      SUNNY HUGHES             
  124.  Subject: Bload File Format?       
  125. ─────────────────────────────────────────────────────────────────────
  126. SH>Does anyone have the format for a Bsaved file... From what I understand
  127. SH>from the on-line help in QB, you should be able to load in a Bsaved file
  128. SH>from and standard I/O device minus the keyboard. What I'm trying to do is
  129. SH>send a Bsaved file with a binary protocol throught the modem and read it
  130. SH>and load it and display it on the remote end. I know I'd have to parse
  131. SH>the input for the beginning of the file then load it, but from there I'm
  132. SH>lost. Does this even sound like a god idea or can someone come up with a
  133. SH>more efficient way of doing it without having to resort to a the remote
  134. SH>user having to have all the Bsaved files on their end with the terminal?
  135.  
  136. Sure..
  137.  
  138. The first 7 bytes are some kind of BSave signature that you can ignore.
  139. Then the next 4000 bytes are the actual screen.  2000 bytes for the
  140. text, and 2000 bytes for the colors.  The first of the 4000 (8th in the
  141. file) is the character in the upper left hand corner.  The next byte is
  142. that charactes attribute.  Then the next character, and its attribte.
  143. Heres some code to read in a bsave file and print it to the screen:
  144.  
  145. open "filename" for binary as #1
  146.  
  147. x$ = space$(7)  'make a dummy buffer to read in the first 7 bytes
  148. get #1,,x$   'read it in and don't do anything with it
  149.  
  150. x$=" "  'now set the buffer size to 1 byte
  151. pointer = 0  'the screen pointer we're using
  152.  
  153. def seg = &HB800  'b000 for mono
  154.  
  155. do until eof(1)
  156.  
  157.   get #1,,x$
  158.   poke pointer, asc(x$)
  159.   pointer=pointer+1
  160.  
  161. loop
  162. def seg
  163.  
  164. close #1
  165.  
  166. This should be pretty slow (*definatly* waaay slower than Bload) but it
  167. will get the job done.  Another thing you could consider doing is saving
  168. the 4000 screen bytes into an array of integers, and then using a
  169. movbytes routine to print them to the screen *instantly*.  I think Mark
  170. Butler posted a movbytes routine, you can ask him for it if you're
  171. interested.
  172.  
  173.  
  174.  * OLX 2.1 TD * Do you expect my opinion to be swayed by mere PROOF?
  175. --- RyPacker v2.5b
  176.  * Origin: The Ghost Mode - An RyBBS System!  (612)-688-0026 (1:282/3006)
  177.  
  178.  
  179. ------------------------------------------------------------------------
  180.   The QuickBASIC Scrapbook                                  
  181.                                                             
  182.   Vol 1, Issue 1                                            January 1993
  183. ------------------------------------------------------------------------
  184. ════════════════════════════════════════════════════════════════════════════════
  185.  Area:    QuickBasic
  186.   Msg:    #19480
  187.  Date:    12-06-92 08:44 (Public) 
  188.  From:    EARL MONTGOMERY          
  189.  To:      ALL                      
  190.  Subject: Animation                
  191. ────────────────────────────────────────────────────────────────────────────────
  192. ' Here is another version of a previous post. This one includes a text
  193. ' scroll:
  194. DEFINT A-Z: SCREEN 7: CLS : x = 60: pg = -1: v = 118: h = 30: up = 23
  195. Q$ = "E2U2R1U4H2R3U1D1R2U1D1R3G2D4R1D2F2L10"
  196. n$ = "E2U1E2U2G2L1H1U1E4R3F2D4G1D2F2L10"
  197. start:
  198. FOR c = 0 TO 7
  199. x = x + 1: h = h + 1: pg = pg + 1: up = up - 1
  200. IF up < 5 THEN up = 23
  201. IF pg + 1 = 8 THEN PCOPY 7, 0: pg = 0
  202. SCREEN , , pg + 1, pg
  203. COLOR 2: CLS
  204. LOCATE 2, 2: COLOR 3: PRINT "Demo Of Animation Using Page Flipping"
  205. LOCATE up, 10: COLOR 1: PRINT "Chess Pieces In The Sky"
  206. DRAW "BM=" + VARPTR$(x) + ",=" + VARPTR$(v)
  207. DRAW "s8;C8;X" + VARPTR$(Q$): PAINT (x + 4, v - 2), 4, 8
  208. DRAW "BM=" + VARPTR$(h) + ",=" + VARPTR$(v)
  209. DRAW "C8;X" + VARPTR$(n$): PAINT (h + 4, v - 2), 15, 8
  210. FOR z = 0 TO 20
  211. PSET (RND * 320, RND * 200), RND * 15
  212. IF x > 300 THEN GOTO holdscrn
  213. NEXT: NEXT
  214. GOTO start
  215. holdscrn:
  216. GOTO holdscrn
  217. 'E N D
  218. Earl
  219.  
  220. --- Maximus 2.01wb
  221.  * Origin: Rabbit and Snake's BBS - Richardson, Texas (1:124/6108)
  222.  
  223.  
  224. ------------------------------------------------------------------------
  225.   The QuickBASIC Scrapbook                                  
  226.                                                             
  227.   Vol 1, Issue 1                                            January 1993
  228. ------------------------------------------------------------------------
  229. ════════════════════════════════════════════════════════════════════════════════
  230.  Area:    QuickBasic
  231.   Msg:    #19971
  232.  Date:    12-05-92 15:30 (Public) 
  233.  From:    ANDY C. OLIVER           
  234.  To:      ALL                      
  235.  Subject: MOUSEQB                  
  236. ────────────────────────────────────────────────────────────────────────────────
  237. 'COPIED FROM COMPUTE APRIL 1992 PG 52
  238. 'ENTERED BY A. CHRISTOPHER OLIVER FOR SUPERLINK BBS.
  239. 'YOU NEED TO LOAD THIS TO THE BEGINNING OF YOUR PROGRAM.
  240. 'OR MAKE IT A LIBRARY
  241. 'SUPERLINK BBS - (904)735-2224 FRI-MON
  242. DEFINT A-Z
  243. '$INCLUDE QB.BI
  244. DECLARE SUB HIDEMOUSE ()
  245. DECLARE SUB SHOWMOUSE ()
  246. DECLARE SUB GETMOUSECORD (K%, K3%, M4%)
  247. DECLARE SUB STARTMOUSE ()
  248. DIM SHARED Inregs AS RegType, Outregs AS RegType
  249.  
  250. STARTMOUSE
  251.  
  252. DO 
  253.   GETMOUSECORD K, X, Y
  254.   LOCATE 1,1
  255.   PRINT X, Y, K
  256. LOOP WHILE K=0
  257.  
  258. HIDEMOUSE
  259. END
  260.  
  261. SUB GETMOUSECORD (K%, M3%, M4%)
  262. Inregs.ax%=3
  263. CALL INTERRUPT(&H33, Inregs, Outregs)
  264. M3%=Outregs.cx% /8+1
  265. M4%=Outregs.dx% /8+1
  266. K%=Outregs.bx%
  267. END SUB
  268.  
  269. SUB HIDEMOUSE
  270. Inregs.ax%=2
  271. CALL INTERRUPT(&H33, Inregs, Outregs)
  272. END SUB
  273.  
  274. SUB SHOWMOUSE
  275. Inregs.ax=1
  276. CALL INTERRUPT(&H33, Inregs, Outregs)
  277. END SUB
  278.  
  279. SUB STARTMOUSE
  280. Inregs.ax%=0
  281. CALL INTERRUPT(&H33, Inregs, Outregs)
  282. Mouseinitialize%=Outregs.ax%
  283. END SUB
  284.  
  285.  
  286. --- TMail v1.31
  287.  * Origin: Cornucopia TBBS - Winter Park, FL - 407/645-4929 (1:363/18)
  288.  
  289.  
  290. ------------------------------------------------------------------------
  291.   The QuickBASIC Scrapbook                                  
  292.                                                             
  293.   Vol 1, Issue 1                                            January 1993
  294. ------------------------------------------------------------------------
  295. ════════════════════════════════════════════════════════════════════════════════
  296.  Area:    QuickBasic
  297.   Msg:    #3771
  298.  Date:    11-21-92 13:45 (Public) 
  299.  From:    SCOTT DRYSDALE           
  300.  To:      JIM COYLE                
  301.  Subject: Existing File check      
  302. ────────────────────────────────────────────────────────────────────────────────
  303. Hi.
  304.  
  305.  
  306.  JC> fucntion Exist% (FileName$)
  307.  JC>        open Filename$ for binary as #1
  308.  JC>        if lof(1)=0 then
  309.  
  310. I use the EXACT same function exept mine uses FREEFILE so as to not disrupt 
  311. anything that might be open at the time.
  312.  
  313.  
  314. --- Maximus 2.01wb
  315.  * Origin: The BULLpen BBS * Intel 14.4EX (613)549-5168 (1:249/140)
  316.  
  317.  
  318. ------------------------------------------------------------------------
  319.   The QuickBASIC Scrapbook                                  
  320.                                                             
  321.   Vol 1, Issue 1                                            January 1993
  322. ------------------------------------------------------------------------
  323. ════════════════════════════════════════════════════════════════════════════════
  324.  Area:    QuickBasic
  325.   Msg:    #4284
  326.  Date:    11-21-92 07:05 (Public) 
  327.  From:    FRANKLIN BEAL            
  328.  To:      BILL CAMPBELL            
  329.  Subject: Randmizing               
  330. ────────────────────────────────────────────────────────────────────────────────
  331. BC>can anyone help me. i wrote a program to randamize numbers, but it
  332.   >keeps repeating the number such as, i type the number 3 and i want it
  333.   >to randamize 1-3 but it will put maybe 1 2 2. so can anyone tell me how
  334.   >to solve my problem?????
  335.   >thanks,
  336.   >bill campbell
  337.  
  338. Try this:
  339.  
  340. DO
  341.    DO: x$ = INKEY$: LOOP UNTIL x$ <> ""
  342.  
  343.    IF x$ = CHR$(27) THEN END
  344.  
  345.    IF VAL(x$) > 0 THEN
  346.       RANDOMIZE TIMER
  347.       x% = INT(VAL(x$))*RND+1
  348.       PRINT x%
  349.    END IF
  350. LOOP
  351.  
  352. If you want to add a lower limit to the generated number, the following
  353. will work.
  354.  
  355. DO
  356.    INPUT "Lower Limit? "; LBound%
  357.    IF LBound% <= 0 THEN END
  358.    INPUT "Upper Limit? "; UBound%
  359.  
  360.    RANDOMIZE TIMER
  361.    x% = INT((LBound% - UBound%) + 1)*RND+LBound%
  362.       PRINT x%
  363.    END IF
  364. LOOP
  365.  
  366. L8R
  367. Franklin Beal
  368.  
  369.  * SLMR 2.0 * Anything worth fixing is worth doing right the first time
  370.  
  371.  
  372. --- WM v2.04/91-0012
  373.  * Origin: Com-Dat BBS  Hillsboro, OR.  HST (503) 681-0543 (1:105/314)
  374.  
  375.  
  376. ------------------------------------------------------------------------
  377.   The QuickBASIC Scrapbook                                  
  378.                                                             
  379.   Vol 1, Issue 1                                            January 1993
  380. ------------------------------------------------------------------------
  381. ════════════════════════════════════════════════════════════════════════════════
  382.  Area:    QuickBasic
  383.   Msg:    #4331
  384.  Date:    11-22-92 00:30 (Public) 
  385.  From:    PETE DUDESEK             
  386.  To:      MICHAEL BAILEY           
  387.  Subject: Variable Sharing in QB45 
  388. ────────────────────────────────────────────────────────────────────────────────
  389.  > combnations of COMMON SHARED, DIM SHARED, and SHARED statements with
  390.  > each of the modules and subs, and the variables still aren't being
  391.  > shared back up to the module level and across to other modules.
  392.  
  393.  > Anyone know what I'm doing wrong, or am I trying to handle this
  394.  
  395. I had the same problem recently and here is how I do it now.
  396.  
  397. This is a simple little test program for you to use to see how
  398. to pass variables in modules. Just cut each one out and save
  399. them as a seperate files. COMMON.INC, DECLARE.INC, MAIN.BAS,
  400. SUB1.BAS, SUB2.BAS, and SUB3.BAS.
  401.  
  402. Now load up QB and load in MAIN.BAS. Then with File/Load command
  403. Load in SUB1.BAS, SUB2.BAS and SUB3.BAS.
  404.  
  405. Now run the program to see it work at passing to and from.
  406.  
  407. ' ----- save this as COMMON.INC --------
  408. ' These are all the common shared variables to be used
  409. ' by MAIN.BAS, SUB1.BAS, SUB2.BAS, SUB3.BAS
  410.  
  411.    COMMON SHARED Global1$, Global2$, Global3$
  412.    COMMON SHARED Global1%, Global2%, Global3%
  413.    COMMON SHARED Global4$()
  414.  
  415.    DIM SHARED Global4$(10)
  416.  
  417.    Global1$ = "This is the Global1$"
  418.    Global2$ = "This is the Global2$"
  419.    Global3$ = "This is the Global3$"
  420.  
  421.    Global1% = 1
  422.    Global2% = 2
  423.    Global3% = 3
  424.  
  425.    FOR Z% = 1 TO 10
  426.  
  427.       Global4$(Z%) = "This is array Global4$ " + STR$(Z%)
  428.  
  429.    NEXT Z%
  430. '----- End of COMMON.INC -----
  431.  
  432. '----- Save this as DECLARE.INC -----
  433. ' This is the common declare file to be used with
  434. ' MAIN.BAS, SUB1.BAS, SUB2.BAS, SUB3.BAS
  435. DECLARE SUB Sub1Sub ()
  436. DECLARE SUB Sub2Sub ()
  437. DECLARE FUNCTION Sub3Function% (Tmp$)
  438. DECLARE FUNCTION Sub3Function4$ (Tmp AS INTEGER)
  439. '----- End of DECLARE.INC -----
  440.  
  441. '----- Save as MAIN.BAS -----
  442. ' This is a simple test program
  443. ' This is the main module called MAIN.BAS
  444. ' $INCLUDE: 'DECLARE.INC'
  445. ' $INCLUDE: 'COMMON.INC'
  446.  
  447. CLS
  448.  
  449. PRINT
  450. PRINT "We are in the main Module"
  451. PRINT
  452.  
  453. Sub1Sub
  454.  
  455. Sub2Sub
  456.  
  457. PRINT Sub3Function(Test$)
  458. PRINT Test$
  459. PRINT
  460.  
  461. PRINT "Press a key to see the Global4$() array passing test"
  462. DO: LOOP WHILE INKEY$ = ""
  463.  
  464. FOR X% = 1 TO 10
  465. PRINT Sub3Function4$(X%)
  466. NEXT X%
  467. END
  468. '----- End of MAIN.BAS -----
  469.  
  470. '----- Save as SUB1.BAS -----
  471. DECLARE SUB Sub1Sub ()
  472. ' This is SUB1.BAS
  473. ' $INCLUDE: 'DECLARE.INC'
  474. ' $INCLUDE: 'COMMON.INC'
  475.  
  476. SUB Sub1Sub
  477. PRINT "Coming to you from SUB1.BAS - SUB Sub1Sub"
  478. PRINT Global1$
  479. PRINT
  480. END SUB
  481.  
  482. '----- End of SUB1.BAS -----
  483.  
  484. '----- Save as SUB2.BAS -----
  485. ' This is SUB2.BAS
  486. ' $INCLUDE: 'DECLARE.INC'
  487. ' $INCLUDE: 'COMMON.INC'
  488.  
  489. Sub2Sub
  490.  
  491. SUB Sub2Sub
  492. PRINT "Coming to you from SUB2.BAS - SUB Sub2Sub"
  493. PRINT Global2$, Global2%
  494. PRINT
  495. END SUB
  496.  
  497. '----- End of SUB2.BAS -----
  498.  
  499. '----- Save as SUB3.BAS -----
  500. ' This is SUB3.BAS
  501. ' $INCLUDE: 'DECLARE.INC'
  502. ' $INCLUDE: 'COMMON.INC'
  503.  
  504. FUNCTION Sub3Function% (Tmp$)
  505. PRINT "Coming to you from SUB1.BAS - FUNCTION Sub3Functiuon%"
  506. Sub3Function% = Global3%
  507. Tmp$ = Global3$
  508. END FUNCTION
  509.  
  510. FUNCTION Sub3Function4$ (Tmp%)
  511. Sub3Function4$ = Global4$(Tmp%)
  512. END FUNCTION
  513.  
  514. '----- End of SUB3.BAS -----
  515.  
  516. Note: That if you create a new FUNCTION in one of the sub modules
  517. remember to create a declare statement for it and put it in the
  518. DECLARE.INC. Same goes for SUB's, even though QB automatically
  519. adds a DECLARE SUB to your MAIN Module.
  520.  
  521. Hope it helps you out.
  522.  
  523.  
  524. --- Squish v1.01
  525.  # Origin: UBU-Midwest - Bensenville IL - 708-766-1089  (8:7401/13)
  526.  * Origin: FamilyNet Intl. Echogate [708] 887-7685 (1:115/887)
  527.  
  528.  
  529. ------------------------------------------------------------------------
  530.   The QuickBASIC Scrapbook                                  
  531.                                                             
  532.   Vol 1, Issue 1                                            January 1993
  533. ------------------------------------------------------------------------
  534. ════════════════════════════════════════════════════════════════════════════════
  535.  Area:    QuickBasic
  536.   Msg:    #4334
  537.  Date:    11-21-92 11:21 (Public) 
  538.  From:    DIK COATES               
  539.  To:      TRENT SHIRLEY            
  540.  Subject: registration encodin     
  541. ────────────────────────────────────────────────────────────────────────────────
  542. >>>> QUOTING Trent Shirley to Dik Coates <<<<
  543.  
  544.  TS> means, and I know NOTHING about Algorithms.
  545.  
  546. Trent, an algorithm is simply a method of formulating a problem
  547. and solving it.  The algorithm for dividing a pile of pennies equally
  548. might be as simple as putting 1 into each of two pockets until the pile has
  549. disappeared...(hoping you have no remainder)...
  550.  
  551.  TS> Even given exact code, would it not still be nearly 
  552.  TS> impossible to crack the unknown algorithm?  That is what I
  553.  
  554. It is not impossible, meerly very difficult...Because the sample (the amount
  555. of encrypted text is small, it is more difficult), combined with the fact
  556. that two different encryption techniques are used, and the results blended
  557. help make it very difficult...It is always possible to go into the program
  558. code and unravel the encryption techniques, but if your application is
  559. sensitive enough that totally bulletproof encryption is required, you should
  560. be working it out with a cryptographic programmer.  I have some DES stuff, and
  561. a bunch of PD source for encryption...for C or Assembly programming or linking
  562. libraries.  If I can find it in my box of goodies, can put it on line, but
  563. from your introductory comments...you might have some problem with it...
  564.  
  565.  TS> was hoping for anyway.  Possibly some mostly useful code, 
  566.  TS> with enough info to formulate my own algorithm.
  567.  
  568. I can upload some of my earlier stuff that can be used... half a dozen
  569. routines for rotating and shuffling bit values (all done in BASIC) if that
  570. will help...but by publishing it, your own approach will be less secure!
  571. Gimme the word, and I'll put it on line...  The following is a bit of an
  572. example of what can be done...your imagination is the only thing stopping
  573. you!
  574.  
  575. An approach you can take is to to take the name... convert each character to
  576. an ASCII value and write the ASCII value in binary form.  For example 'A' has
  577. an ASCII value of 65 which has a binary value of 01000001.  This binary number
  578. can be rotated 3 to the left yielding the binary value 00001010 which is the
  579. same ASCII value 10 which corresponds to the symbol of 'a dark square with a
  580. small white o in the centre'.  The same letter 'A' can be rotated 4 characters
  581. to the left yielding a binary number 00010100 which is the same as ASCII value
  582. 20 yielding the symbol that looks like 'an uppercase backwards P'.  These 
  583. values
  584. can be written to a binary file and someone not knowing the method of 
  585. encryption
  586. will not be able to decypher the letters A and A.  The program can read the
  587. first symbol and convert it back to an 'A' and then read the second sysbol and
  588. convert it to an 'A' and compare the values...if they are the same, no one has
  589. tampered with the encrypted file...I hope you can follow this so far...tried 
  590. to
  591. make it as clear as I can.
  592.  
  593. The method of encryption above is fairly simple, but unless someone knows the
  594. technique, they will have difficulty 'breaking' the code.  It can be made much
  595. more complicated simply by making the amount it shifted to the left dependent
  596. on the letter, so they all shift different amounts, or the value shifted can
  597. depend on the character in front or behind.
  598.  
  599. Another approach is to take the binary value and separate every second bit
  600. value and combine the two halves.  For example 1 0 1 1 0 0 1 0 becomes
  601.                                                ^   ^   ^   ^
  602.                                                1 1 0 1 and 0 1 0 0
  603. so 10110010 becomes 1101 0100.
  604.  
  605. Hope I haven't confused you too badly...will post some simple stuff if you
  606. want.
  607.  
  608.  TS> I was just hoping for something a bit generic that would be
  609.  TS> applicable.
  610.  
  611. There may be some PD encryption routines in BASIC out there, but I'm not
  612. familiar with them.  Regards Dik
  613.  
  614.  TS>  ! Origin: Pioneer Valley PCUG1 (1:321/109)
  615.  
  616. Where's this at?
  617.  
  618. ... Damn touchscreen, Anyone see my braille tagline... -Dik
  619. --- Blue Wave/QWK v2.10
  620.  
  621. --- Maximus 2.00
  622.  * Origin: Durham Systems (ONLINE!) (1:229/110)
  623.  
  624.  
  625. ------------------------------------------------------------------------
  626.   The QuickBASIC Scrapbook                                  
  627.                                                             
  628.   Vol 1, Issue 1                                            January 1993
  629. ------------------------------------------------------------------------
  630. ════════════════════════════════════════════════════════════════════════════════
  631.  Area:    QuickBasic
  632.   Msg:    #3934
  633.  Date:    11-21-92 23:08 (Public) 
  634.  From:    RICH GELDREICH           
  635.  To:      ALL                      
  636.  Subject: Asm Fader/fix 1                                               (ASM)
  637. ─────────────────────────────────────────────────────────────────────────────
  638. Ooops! After looking back at the ASM fader I posted a few days ago, I 
  639. discovered that I posted the wrong one! Duh! Well, here is the one I 
  640. originally wanted to post. The ASM code follows. Next message has OBJ 
  641. and test program.
  642.  
  643. ;Noiseless VGA DAC fading routines for QB4.5/PDS(works on 286's and up)
  644. ;By Rich Geldreich 1992
  645. ;Assembled with TASM v2.0
  646. .286
  647. IDEAL
  648. MODEL SMALL
  649. DATASEG
  650. Palette    db 768 dup (?)
  651. NewPalette db 768 dup (?)
  652. CODESEG
  653. PUBLIC GetPalette, SetPalette
  654. EVEN
  655. PROC    SetPalette              ;Sets the pallette retrieved by 
  656.                                 ;GetPalette to a specified brightness
  657. ;DECLARE SUB SetPalette (BYVAL Brigtness, BYVAL Start, BYVAL Num)
  658. Brightness EQU [ss:bp+10] ;0-128
  659. Start      EQU [ss:bp+08] ;0-255
  660. Num        EQU [ss:bp+06] ;1-256
  661. Parameters = 3
  662.         Push    bp              ;set us up a stack frame
  663.         Mov     bp, sp
  664.         Push    es ds si di     ;lets not get QB mad now
  665.         Mov     ax, @data       ;get access to palette buffers
  666.         Mov     ds, ax
  667.         Mov     es, ax
  668.         Xor     ax, ax
  669.         Mov     al, Start       ;get start color
  670.         Mov     dx, 03C7h       ;tell the VGA some DAC values will
  671.         Out     dx, al          ;be coming
  672.         Inc     dx
  673.         Out     dx, al
  674.         Inc     dx              ;dh=3
  675.         Mov     si, ax          ;add start*3 to the palette offset
  676.         Shl     si, 1
  677.         Add     si, ax
  678.         Add     si, offset Palette
  679.         Mov     bl, Brightness  
  680.         Cmp     bl, 128         ;limit brightness if too high
  681.         Jna     @@Ok1
  682.         Mov     bl, 128
  683. @@Ok1:        
  684.         Mov     cx, Num         ;CX=# of registers to change
  685.         Jcxz    @@Done          ;if no registers to change then exit
  686.         Add     ax, cx          ;calculate the last register to change
  687.         Sub     ax, 256         ;if too many then limit
  688.         Jna     @@OK2
  689.         Sub     cx, ax
  690. @@OK2:        
  691.         Mov     di, offset NewPalette
  692.         Mov     bp, cx          ;save cx for later
  693. EVEN                            ;color precalculation loop
  694. @@10:   REPT    3               ;repeat 3 times(for Red, Green, & Blue)
  695.         Lodsb                   ;
  696.         Mul     bl              ;new=old*brightness
  697.         Shl     ax, 1           ;new=(new*2)\256 or new=new\128
  698.         Mov     al, ah
  699.         Stosb
  700.         ENDM
  701.         Loop    @@10
  702.         Mov     cx, bp          ;multiply number of colors by 3
  703.         Shl     cx, 1
  704.         Add     cx, bp
  705.         Mov     si, offset NewPalette
  706.         Mov     dl, 0DAh        ;wait for vertical retrace
  707. @@15:   In      al, dx          ;wait for end of vertical retrace
  708.         Test    al, 8           ;(for very fast machines)
  709.         Jnz     @@15
  710. @@20:   In      al, dx          ;now wait for start of vertical
  711.         Test    al, 8           ;retrace
  712.         Jz      @@20
  713.         Mov     dl, 0C9h        ;dx=03C9h
  714.         Rep     Outsb           ;output the new colors
  715. @@Done:
  716.         Pop     di si ds es bp  
  717.         Retf    Parameters*2    ;bye bye
  718. ENDP    SetPalette
  719. PROC    GetPalette              ;Must call this routine before 
  720. ;DECLARE SUB GetPalette ()      ;SetPalette!
  721.         Push    es
  722.         Mov     ax, @data
  723.         Mov     es, ax
  724.         Mov     dx, offset Palette ;es:dx addresses palette
  725.         Mov     cx, 256
  726.         Xor     bx, bx
  727.         Mov     ax, 01017h
  728.         Int     010h
  729.         Pop     es
  730.         Retf    0
  731. ENDP    GetPalette
  732. END
  733.  
  734. --- MsgToss 2.0b
  735.  * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
  736.  
  737.  
  738. ------------------------------------------------------------------------
  739.   The QuickBASIC Scrapbook                                  
  740.                                                             
  741.   Vol 1, Issue 1                                            January 1993
  742. ------------------------------------------------------------------------
  743. ════════════════════════════════════════════════════════════════════════════════
  744.  Area:    QuickBasic
  745.   Msg:    #4061
  746.  Date:    11-21-92 19:35 (Public) 
  747.  From:    BRENT ASHLEY             
  748.  To:      RAYMOND PAQUIN           
  749.  Subject: QB SIMULTANEOUS KEYS                                          (ASM)
  750. ─────────────────────────────────────────────────────────────────────────────
  751. ;
  752. ; KeyPress.ASM by Brent Ashley
  753. ;   maintains map of  the "pressed" status of all keys
  754. ;   allows you to detect multiple keys pressed
  755. ;
  756. .model medium, basic
  757. .code
  758. Old09        Label Dword          ;Label for to old Int 09h handler
  759. Old09Offset  dw ?                 ;Offset part
  760. Old09Segment dw ?                 ;Segment part
  761. Hooked       db 0                 ;Our installed flag
  762. KeyMap       db 80h dup(0)        ;map of kybd, one byte per scancode
  763.  
  764. InstKeyPress proc uses ds ax dx   ; From BASIC: CALL InstKeyPress
  765.                                   ; REMEMBER to call UnhookKeyPress!
  766.         cmp cs:Hooked,0           ;Are we already hooked?
  767.         jnz InstallExit           ;If so, exit
  768.         mov ax,3509h              ;Get current vector for int 09h
  769.         int 21h
  770.         mov cs:Old09Segment,es    ;Remember it for later
  771.         mov cs:Old09Offset,bx
  772.         mov ax,2509h
  773.         push ds
  774.         push cs
  775.         pop ds                    ;Point int 09h handler to our code
  776.         mov dx, offset OurInt09
  777.         int 21h
  778.         pop ds
  779.         mov cs:Hooked,-1          ;Set our installed flag
  780.  
  781. InstallExit:
  782.         ret
  783.  
  784. OurInt09:                         ;Our Int 09h handler
  785.         push ax
  786.         push bx
  787.         push dx
  788.         push si
  789.  
  790.         in al, 60h                ;get scancode from keyboard port
  791.         test al, 080h             ;is "released" bit set?
  792.         jnz Released              ;yup - go to it
  793.         mov dl, 0FFh              ;nope - set key pressed flag
  794.         jmp PutFlag
  795.  
  796. Released:
  797.         and al, 07Fh              ;yes - clear bit for index
  798.         mov dl, 0                 ;and set flag for release
  799.  
  800. PutFlag:
  801.         xor ah, ah
  802.         mov si, ax                ;assign index
  803.         mov cs:KeyMap[si], dl     ;put flag in place
  804.  
  805.         pop si
  806.         pop dx
  807.         pop bx
  808.         pop ax
  809.  
  810. Continue:
  811.         jmp dword ptr cs:[Old09]  ;Transfer control to orig Int 09h
  812. InstKeyPress endp
  813.  
  814. KeyPressed proc uses bx si, ScanCode:WORD
  815.         ; from BASIC: TrueOrFalse% = KeyPressed(ScanCode%)
  816.         mov bx, ScanCode          ;get scan code addr
  817.         mov si, [bx]              ;load value as index
  818.  
  819.         mov al, cs:KeyMap[si]     ;put flag in al
  820.         and al, 07Fh              ;make sure less than 80h
  821.         cbw                       ;convert to word for integer value
  822.         ret
  823. KeyPressed endp
  824.  
  825. UnhookKeyPress proc               ; from BASIC: CALL UnHookKeyPress
  826.         cmp cs:Hooked,0           ; are we installed?
  827.         jz UnHooked               ; nope - exit
  828.  
  829.         push ax
  830.         push ds
  831.         mov ax,2509h              ;Unhook ourself
  832.         mov ds,Old09Segment
  833.         mov dx,Old09Offset
  834.         int 21h                   ;Point Int 09h back to original
  835. handler
  836.         pop ds
  837.         pop ax
  838.         mov cs:Hooked,0           ;Set installed flag back to zero
  839.  
  840. UnHooked:
  841.         ret
  842. UnhookKeyPress endp
  843. END
  844. --- FidoPCB v1.3 [ff053/x]
  845.  * Origin: Canada Remote Systems, Mississauga, Ontario  (1:229/15)
  846.  
  847.  
  848. ------------------------------------------------------------------------
  849.   The QuickBASIC Scrapbook                                  
  850.                                                             
  851.   Vol 1, Issue 1                                            January 1993
  852. ------------------------------------------------------------------------
  853. ════════════════════════════════════════════════════════════════════════════════
  854.  Area:    QuickBasic
  855.   Msg:    #4068
  856.  Date:    11-21-92 22:40 (Public) 
  857.  From:    MATHIEU BOUCHARD         
  858.  To:      ALL                      
  859.  Subject: VGA graphics/Palette     
  860. ────────────────────────────────────────────────────────────────────────────────
  861. Here is my LIGHTNING FAST palette writer...
  862.  
  863. load QB.QLB...
  864.  
  865. $include:'qb.bi'
  866. dim rin as regtypex
  867. dim rout as regtypex
  868.  
  869. dim pal as string * 768
  870.  
  871. ...
  872.  
  873. 'to change palette: c=color, r=red 0-63, g=green 0-63, b=blue 0-63
  874. mid$(pal,c*3+1,3)=chr$(r)+chr$(g)+chr$(b)
  875.  
  876. 'after all your changes, let's update:
  877. rin.ax=&h1012:rin.bx=0:rin.cx=256:rin.dx=varptr(pal):rin.es=varseg(pal)
  878. interruptx &h10,rin,rout
  879.  
  880.  
  881. --- Maximus 2.01wb
  882.  * Origin: R&D BBS, (819) 772-2952 HST/V32 (Line 2) (1:163/506)
  883.  
  884.  
  885. ------------------------------------------------------------------------
  886.   The QuickBASIC Scrapbook                                  
  887.                                                             
  888.   Vol 1, Issue 1                                            January 1993
  889. ------------------------------------------------------------------------
  890. ════════════════════════════════════════════════════════════════════════════════
  891.  Area:    QuickBasic
  892.   Msg:    #5003
  893.  Date:    11-21-92 11:14 (Public) 
  894.  From:    PETER BARNEY             
  895.  To:      MARK THOMAS              
  896.  Subject: Error Level              
  897. ────────────────────────────────────────────────────────────────────────────────
  898. Try this (you must load QB.QLB or QBX.QLB for this to work)
  899.  
  900.  
  901. '$INCLUDE 'QB.BI'    '<- qbx.bi for pds.
  902.  
  903. SUB ExitProgram (s)
  904. 'Exits the program with an errorlevel.  Instead of END, use
  905. 'ExitProgram <int> where <int> is the error level you wish
  906. 'to exit with
  907.  
  908. DIM Regs AS RegType
  909. Regs.ax = &H4C00 + (s AND 255)
  910. CALL Interrupt(&H21, Regs, Regs)
  911. END SUB
  912.  
  913. --- FMail 0.92
  914.  * Origin: Pete's Place - Toledo, Ohio (1:234/35.1)
  915.  
  916.  
  917. ------------------------------------------------------------------------
  918.   The QuickBASIC Scrapbook                                  
  919.                                                             
  920.   Vol 1, Issue 1                                            January 1993
  921. ------------------------------------------------------------------------
  922. ════════════════════════════════════════════════════════════════════════════════
  923.  Area:    QuickBasic
  924.   Msg:    #5004
  925.  Date:    11-21-92 11:29 (Public) 
  926.  From:    PETER BARNEY             
  927.  To:      MARK THOMAS              
  928.  Subject: Networking....Share      
  929. ────────────────────────────────────────────────────────────────────────────────
  930.  >     When running on a network, I get a share violation.
  931.  >     Can anyone suggest a way that I can prevent this problem
  932.  
  933. OPEN "filename.ext" FOR RANDOM ACCESS <access> <lock> AS #1 LEN=whatever
  934.  
  935. Replace <access> with:
  936.        Read     Opens the file for reading only.
  937.       Write     Opens the file for writing only.
  938.  Read Write     Opens the file for both reading and writing.
  939.                 (This mode works only on random and binary files,
  940.                 and files opened for append.)
  941.  
  942. Replace <lock> with:
  943.           Shared    Any process on any machine can work with the
  944.                     file.
  945.        Lock Read    No other process can read the file.  (this
  946.                     access is granted only if no other process has
  947.                     a previous read access to the file.
  948.       Lock Write    No other process is granted write access to this
  949.                     file.  This lock is granted only if no other
  950.                     process has a previous write access to the file.
  951.  Lock Write Read    No other process is granted either read or write
  952.                     write acess to the file.  This access is granted
  953.                     only if read or write access has not been already
  954.                     granted to another process, or if a lock read or
  955.                     lock write is not already in place.
  956.  
  957. hope this helps!
  958.  
  959. --- FMail 0.92
  960.  * Origin: Pete's Place - Toledo, Ohio (1:234/35.1)
  961.  
  962.  
  963. ------------------------------------------------------------------------
  964.   The QuickBASIC Scrapbook                                  
  965.                                                             
  966.   Vol 1, Issue 1                                            January 1993
  967. ------------------------------------------------------------------------
  968. ════════════════════════════════════════════════════════════════════════════════
  969.  Area:    QuickBasic
  970.   Msg:    #5450
  971.  Date:    11-28-92 20:08 (Public) 
  972.  From:    LEE MADAJCZYK            
  973.  To:      JAMES FRAZEE             
  974.  Subject: PCX Load SUB
  975. ────────────────────────────────────────────────────────────────────────────────
  976.  JF>   Is there a program to convert .PCX into a .BSV file. I found  
  977.  JF> out finally how easy it is too BLOAD a .BSV file and If I can  
  978.  JF> convert a .PCX into a .BSV it would be easier. 
  979.  JF>   
  980.  JF>   Now if someone can give me code to load a 16 color .PCX file  
  981.  JF> as a menu for a game,let me know,please. 
  982.       
  983. Here you go.... (I stole this from SOMEWHERE....)      
  984.  
  985.      'PCX SAVE & PCX LOAD FOR EGA SCREEN 9 (640 x 350, 16 COLOR)           
  986.      'BY G.C.HARDER, RE-ENGINEERED FROM C SOURCE IN 
  987.      ' "FRACTAL PROGRAMMING IN C" 
  988.     
  989.      DEFINT A-Z 
  990.      DECLARE SUB PCXSave (File$, Pal.Array%()) 
  991.      DECLARE SUB PCXLoad (File$, Pal.Array%()) 
  992.  
  993.      FileName$ = "Demo4.PCX" 
  994.      SCREEN 9, 0, 1, 0 
  995.      DIM Pal.Array%(15) 
  996.      FOR I% = 0 TO 15: READ Pal.Array%(I%): NEXT 
  997.      CLS 
  998.      LOCATE 25, 30: PRINT "Loading " + FileName$; 
  999.    
  1000.      PCXLoad FileName$, Pal.Array%() 
  1001.      'default Palette Colors                                              
  1002.      DATA 0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63                       
  1003.  
  1004.         
  1005. SUB PCXLoad (File$, Pal.Array%()) STATIC       
  1006.         SCREEN 9, 0, 0, 0: OPEN File$ FOR BINARY AS #1: SEEK #1, 17 
  1007.         DIM Byte AS STRING * 1 
  1008.         FOR I% = 0 TO 15 
  1009.            GET #1, , Byte: red% = ASC(Byte) / 85 
  1010.            GET #1, , Byte: green% = ASC(Byte) / 85 
  1011.            GET #1, , Byte: Blue% = ASC(Byte) / 85 
  1012.            red% = ((red% AND 1) * 32) OR ((red% AND 2) * 2) 
  1013.            green% = ((green% AND 1) * 16) OR (green% AND 2) 
  1014.            Blue% = ((Blue% AND 1) * 8) OR ((Blue% AND 2) \ 2) 
  1015.            Hue% = red% OR green% OR Blue%: Pal.Array%(I%) = Hue% 
  1016.         NEXT 
  1017.         PALETTE USING Pal.Array%(0): SEEK #1, 129: DEF SEG = &HA000 
  1018.         FOR k% = 0 TO 349 
  1019.            A$ = INKEY$: IF A$ = CHR$(27) THEN END 
  1020.            Addr% = 80 * k%: Line.end% = Addr% + 80: J% = 1 
  1021.            DO WHILE J% <= 4 
  1022.               B% = J% 
  1023.               IF J% = 3 THEN B% = 4 
  1024.               IF J% = 4 THEN B% = 8 
  1025.               OUT &H3C4, 2: OUT &H3C5, B% 
  1026.               GET #1, , Byte: Byte.1% = ASC(Byte) 
  1027.               IF (Byte.1% AND 192) <> 192 THEN 
  1028.                  POKE Addr%, Byte.1%: Addr% = Addr% + 1 
  1029.                  IF Addr% >= Line.end% THEN Addr% = 80 * k%: J% = J% + 1 
  1030.               ELSE 
  1031.                  Byte.1% = Byte.1% AND 63 
  1032.                  GET #1, , Byte: Byte.2% = ASC(Byte) 
  1033.                  FOR M% = 1 TO Byte.1% 
  1034.                     B% = J% 
  1035.                     IF J% = 3 THEN B% = 4 
  1036.                     IF J% = 4 THEN B% = 8 
  1037.                     OUT &H3C4, 2: OUT &H3C5, B%: POKE Addr%, Byte.2% 
  1038.                     Addr% = Addr% + 1 
  1039.                     IF Addr% >= Line.end% THEN Addr% = 80 * k%: J% = J% + 1 
  1040.                  NEXT 
  1041.               END IF 
  1042.            LOOP 
  1043.         NEXT 
  1044.         OUT &H3C4, 2: OUT &H3C5, &HF: DEF SEG ': CLOSE #1 
  1045.   
  1046.      END SUB 
  1047.  
  1048.  
  1049. Hope this helps. After you load your file, just BSAVE it. If you 
  1050. want the PCX saving routine, or anyone else for that matter, give 
  1051. me a ring! 
  1052.  
  1053.                                     Lee Madajczyk 
  1054.                                     Quantum Software 
  1055.  
  1056. ... OFFLINE 1.40 * Difference between a virus & Windows? Viruses don't fail. 
  1057. --- 
  1058.  * Origin:  Infinity   -=[HST]=- (1:280/5)
  1059.  
  1060.  
  1061. ------------------------------------------------------------------------
  1062.   The QuickBASIC Scrapbook                                  
  1063.                                                             
  1064.   Vol 1, Issue 1                                            January 1993
  1065. ------------------------------------------------------------------------
  1066. ════════════════════════════════════════════════════════════════════════════════
  1067.  Area:    QuickBasic
  1068.   Msg:    #5543
  1069.  Date:    11-23-92 19:07 (Public) 
  1070.  From:    STEVE GARTRELL           
  1071.  To:      ROBERT CHURCH            
  1072.  Subject: QB/PDS/VBDOS INT Handlers
  1073. ────────────────────────────────────────────────────────────────────────────────
  1074. 'So Basic can't do interrupt handlers...The DemRegs variable
  1075. 'passes back the status of the registers at the time of the
  1076. 'interrupt.  Likewise, if you change a DemRegs.(anyreg)
  1077. 'value inside the handler sub, that value will be placed
  1078. 'in the respective register!!!  Dangerous toy, A?  The
  1079. 'global variable Busy% is read inside the Absolute array
  1080. 'ASM; if it's <> 0 then the routine chains directly (mostly)
  1081. 'to the original vector.  Which you will want, if you are going
  1082. 'to DEF SEG out of DGROUP, for instance!!!
  1083. 'NOT FOR USE IN THE ENVIRONMENT!!  Compile it, and then
  1084. 'let it run for 20 or 30 seconds, and you'll start seeing the
  1085. ' registers passed back...
  1086. '
  1087. 'This is _not_ a toy...If you are not sure what you are doing,
  1088. ' try thinking about worst-case scenarios, and take proper
  1089. ' preventative measures...Like, if you play with disk access
  1090. ' interrupts, BACK UP!!
  1091.  
  1092. 'Compiled and tested under QB45 and PDS...
  1093. DEFINT A-Z
  1094. '$INCLUDE: 'VBDOS.BI'   'QB.BI if using QB4.5, QBX.BI in PDS
  1095. DECLARE SUB Handler ()
  1096. 'remark out the original DECLARE SUB Absolute declaration in your
  1097. ' include file; it's modified here...
  1098. DECLARE SUB Absolute (RegsOff%, Busy%, OldSeg%, OldOff%,_
  1099.  StartPtr%, address AS INTEGER)
  1100. 'bet ya can't guess what my middle initial is...
  1101. TYPE SKGregs
  1102.   ax AS INTEGER
  1103.   bx AS INTEGER
  1104.   cx AS INTEGER
  1105.   dx AS INTEGER
  1106.   si AS INTEGER
  1107.   di AS INTEGER
  1108.   es AS INTEGER
  1109.   ds AS INTEGER
  1110.   flags AS INTEGER
  1111.   bp AS INTEGER
  1112. END TYPE
  1113.  
  1114. CONST C$ = "Created 08/31/92 by Steve Gartrell."
  1115. 'don't want this stuff moving around!!!  These
  1116. ' MUST remain global!!!
  1117. '$STATIC
  1118. DIM SHARED AsmArray%(1 TO 88), DemRegs AS SKGregs
  1119. DIM SHARED OldOff%, OldSeg%, RetToAsm%, RegsOff%, SetUp%
  1120. DIM SHARED TicCnt%, Busy%
  1121. '$DYNAMIC
  1122. CLS
  1123. LOCATE 1, 70: PRINT LEFT$(TIME$, 8)
  1124.  
  1125. SetUp% = VARPTR(AsmArray%(47))
  1126. RetToAsm% = VARPTR(AsmArray%(29))
  1127. NewSeg% = VARSEG(AsmArray%(1))
  1128. NewOff% = VARPTR(AsmArray%(1))
  1129. RegsOff% = VARPTR(DemRegs)
  1130.  
  1131. DIM Regs AS RegTypeX
  1132.  
  1133. 'DOS get interrupt vector using the clock 08h for
  1134. ' demo purposes...Can use any other, too, but be
  1135. ' aware that results can be extremely dependent
  1136. ' upon what QB/PDS has done/is gonna do with the
  1137. ' original vector!!!
  1138. Regs.ax = &H3508
  1139. CALL INTERRUPTX(&H21, Regs, Regs)
  1140. 'save 08h original vector
  1141. OldSeg% = Regs.es
  1142. OldOff% = Regs.bx
  1143. 'read all the sneaky little ASM opcodes in, which are primarily
  1144. ' concerned with register saving, and navigating around the
  1145. ' flow "limitations" imposed by QB/PDS...
  1146. RESTORE
  1147. FOR Word% = 1 TO 88
  1148.   READ DataStr$
  1149.   AsmArray(Word%) = VAL(DataStr$)
  1150. NEXT
  1151.  
  1152. 'Call the sub that sets up necessary address calculations...
  1153.  
  1154. Handler   'OldSeg% & OldOff% are global, remember...
  1155.  
  1156. 'Use DOS set interrupt call to change interrupt &H08 vector to
  1157. ' the one returned for the AsmArray code that resides in DGROUP...
  1158. Regs.ax = &H2508
  1159. Regs.ds = NewSeg%
  1160. Regs.dx = NewOff%
  1161. CALL INTERRUPTX(&H21, Regs, Regs)
  1162.  
  1163. cnt& = 0
  1164. DO
  1165.   'gotta do something to show clock is interrupt driven
  1166.   ' Fix Busy% true, and the interrupt-driven time
  1167.   ' print can occur before this LOCATE and PRINT finish,
  1168.   ' with the number then showing up at coordinate 2,1!!
  1169.   cnt& = cnt& + 1
  1170.   Busy% = -1
  1171.   LOCATE 5, 35
  1172.   PRINT cnt&;
  1173.   Busy% = 0
  1174.   IF cnt& > 2000000 THEN cnt& = 1
  1175. LOOP UNTIL LEN(INKEY$)
  1176.  
  1177. 'Return INT &H08 to it's original vector-THIS MUST ALWAYS
  1178. ' BE DONE!!!
  1179. Regs.ax = &H2508
  1180. Regs.ds = OldSeg%
  1181. Regs.dx = OldOff%
  1182. CALL INTERRUPTX(&H21, Regs, Regs)
  1183.  
  1184. LOCATE 24, 1
  1185.  
  1186. END 'This is the end, my FIDO friend, the end...
  1187.  
  1188. '88 WORDS, FIRST call at VARPTR(47), LAST call at VARPTR(29)
  1189. ReversedOpcodes:
  1190.  
  1191. DATA &H8B55,&H9CEC,&H061E,&H5657,&H5152,&H5053,&HD78C,&HDF8E
  1192. DATA &H90BB,&H8B90,&H2307,&H75C0,&H8E30,&H8BC7,&HFCF4,&H90BF
  1193. DATA &HB990,&H000A,&HA5F3,&HEF83,&H5714,&HEE83,&H5614,&HB8FB
  1194. DATA &H9090,&HB850,&H9090,&HCB50,&HC483,&H8C0E,&H8ED7,&H8EDF
  1195. DATA &H5FC7,&HFC5E,&H0AB9,&HF300,&H58A5,&H595B,&H5E5A,&H075F
  1196. DATA &H9D1F,&H2E5D,&H2EFF,&H0058,&H9090,&H9090,&H8B55,&H50EC
  1197. DATA &H5253,&H8B56,&H065E,&H1F8B,&HEB83,&H8B5C,&H0246,&H0305
  1198. DATA &H8900,&H3487,&H8B00,&H0446,&H8789,&H0030,&HF38B,&H5E8B
  1199. DATA &H8B08,&H8917,&H5894,&H8B00,&H0A5E,&H178B,&H9489,&H005A
  1200. DATA &H5E8B,&H890C,&H119C,&H8B00,&H0E5E,&H178B,&H9489,&H001F
  1201. DATA &HC68B,&H5805,&H8900,&H5644,&H5A5E,&H585B,&HCA5D,&H000A
  1202.  
  1203. REM $STATIC
  1204. STATIC SUB Handler ()
  1205.  
  1206. SHARED OldOff%, OldSeg%, RetToAsm%, RegsOff%, SetUp%
  1207. SHARED TicCnt%, Busy%, DemRegs AS SKGregs, NewOff%
  1208.  
  1209. 'Make sure we're looking at DGROUP
  1210. DEF SEG
  1211.  
  1212. CALL Absolute(RegsOff%, Busy%, OldSeg%, OldOff%, SetUp%, SetUp%)
  1213. EXIT SUB
  1214.  
  1215. 'This routine's LIFE DEPENDS UPON a certain amount of
  1216. ' code bytes between the EXIT SUB and the next command
  1217. ' (happens to be JGE [IF < THEN] here, but not critical).  IF
  1218. ' YOU SPECIFY /D(ebug) when compiling, YOUR system will HANG!!
  1219. ' ('Cuz the compiler will sneak some stuff in in between
  1220. '  the EXIT SUB and your first line of code!!!)  Also, ERROR
  1221. ' handling (/E/X compile options) in QB is probably
  1222. ' impossible, and should be approached with care in PDS (like,
  1223. ' anything but LOCAL error handling is probably out of the
  1224. ' question, and LOCAL in this sub is a no-no!!!)
  1225. ' Put any code you want between the EXIT SUB and the
  1226. ' DEF SEG...EXCEPT (at least) END or it's equivalents...
  1227. ' You MUST return the clock to it's original vector before
  1228. ' exiting to DOS, SHELLing, and so forth!!!
  1229.  
  1230. 'update if 10 seconds have elapsed AND it's safe to do so!
  1231.  
  1232. IF TicCnt% < 10 THEN
  1233.   TicCnt% = TicCnt% + 1   'a little delay...
  1234. ELSE
  1235.   Busy% = -1
  1236.   LOCATE 1, 70
  1237.   PRINT LEFT$(TIME$, 8)  'update the time
  1238.   LOCATE 2, 1
  1239.   'print the register values at interrupt...
  1240.   ' Remember, if you change a register variable at
  1241.   ' this point, it _will_ change the register contents!!
  1242.   PRINT "AX = "; HEX$(DemRegs.ax); "h"; SPACE$(4)
  1243.   PRINT "BX = "; HEX$(DemRegs.bx); "h"; SPACE$(4)
  1244.   PRINT "CX = "; HEX$(DemRegs.cx); "h"; SPACE$(4)
  1245.   PRINT "DX = "; HEX$(DemRegs.dx); "h"; SPACE$(4)
  1246.   PRINT "SI = "; HEX$(DemRegs.si); "h"; SPACE$(4)
  1247.   PRINT "DI = "; HEX$(DemRegs.di); "h"; SPACE$(4)
  1248.   PRINT "ES = "; HEX$(DemRegs.es); "h"; SPACE$(4)
  1249.   PRINT "DS = "; HEX$(DemRegs.ds); "h"; SPACE$(4)
  1250.   PRINT "BP = "; HEX$(DemRegs.bp); "h"; SPACE$(4)
  1251.   PRINT "Flags = "; HEX$(DemRegs.flags); "h"; SPACE$(4)
  1252.   TicCnt% = 1
  1253.   Busy% = 0
  1254. END IF
  1255.  
  1256. DEF SEG
  1257. CALL Absolute(dummy%, dummy%, dummy%, dummy%, dummy%, RetToAsm%)
  1258.  
  1259. END 'I stuck this END in here just to show you that
  1260.    ' the instruction pointer will never get here...
  1261.  
  1262. END SUB
  1263.  
  1264.  
  1265. --- D'Bridge 1.30/071082
  1266.  * Origin: RadioLink! Columbus, OH (614)766-2162 HST/DS (1:226/140)
  1267.  
  1268.  
  1269. ------------------------------------------------------------------------
  1270.   The QuickBASIC Scrapbook                                  
  1271.                                                             
  1272.   Vol 1, Issue 1                                            January 1993
  1273. ------------------------------------------------------------------------
  1274. ════════════════════════════════════════════════════════════════════════════════
  1275.  Area:    QuickBasic
  1276.   Msg:    #5544
  1277.  Date:    11-23-92 19:08 (Public) 
  1278.  From:    STEVE GARTRELL           
  1279.  To:      ROBERT CHURCH            
  1280.  Subject: QB/PDS/VBDOS INT Handlers
  1281. ────────────────────────────────────────────────────────────────────────────────
  1282.       .model medium, basic
  1283.  
  1284.       .code
  1285.  
  1286. handle  PROC
  1287. IntEntry:
  1288.  
  1289.   push    bp                      ; push everything
  1290.   mov     bp, sp                  ; stack frame
  1291.   pushf
  1292.   push    ds
  1293.   push    es
  1294.   push    di
  1295.   push    si
  1296.   push    dx
  1297.   push    cx
  1298.   push    bx
  1299.   push    ax
  1300.  
  1301.  
  1302.   mov     di, ss                  ;cuz the damned data seg
  1303.   mov     ds, di                  ; can get lost
  1304.  
  1305. BusyOff:
  1306.   mov     bx, 9090h
  1307.   mov     ax, [bx]
  1308.   and     ax, ax
  1309.   jnz     SHORT TooBusy
  1310.  
  1311.   mov     es, di                  ;point dest seg at DGROUP
  1312.   mov     si, sp                  ;stack address for regs to si
  1313.   cld
  1314.  
  1315. RegsOff:
  1316.   mov     di, 9090h               ;QB/PDS reg TYPE offset to di
  1317.  
  1318.   mov     cx, 0Ah
  1319.   rep     movsw
  1320.  
  1321.   sub     di, 14h
  1322.   push    di
  1323.   sub     si, 14h
  1324.   push    si
  1325.   sti
  1326.  
  1327. HandSeg:
  1328.   mov     ax, 9090h               ;Here the QB sub segment
  1329.   push    ax                      ; is placed on the stack for the
  1330.           ; RETF
  1331. HandOff:
  1332.   mov     ax, 9090h               ;Here the QB sub offset
  1333.   push    ax                      ; is placed on the stack for the
  1334.   retf                            ; RETF
  1335.  
  1336. AllDone:
  1337.  
  1338.   add     sp, 0Eh                 ;roll the stack ptr back past the
  1339.           ; last CALL Absolute far return
  1340.           ; address and the five dummy
  1341.           ; variables on the stack.  Then
  1342.           ; pop everything
  1343.  
  1344.   mov     di, ss                  ;cuz the damned data seg
  1345.   mov     ds, di                  ; can get lost
  1346.   mov     es, di
  1347.  
  1348.   pop     di                      ;popped in reverse dest/source
  1349.   pop     si
  1350.  
  1351.   cld
  1352.   mov     cx, 0Ah
  1353.   rep     movsw
  1354.  
  1355. TooBusy:
  1356.   pop     ax
  1357.   pop     bx
  1358.   pop     cx
  1359.   pop     dx
  1360.   pop     si
  1361.   pop     di
  1362.   pop     es
  1363.   pop     ds
  1364.   popf
  1365.   pop     bp
  1366.   jmp     cs:OldInt
  1367.  
  1368. JmpAddr:
  1369.  
  1370. OldInt  DD      90909090h
  1371.  
  1372. Start:
  1373.   assume  ds:seg IntEntry
  1374.   push    bp                      ; set up stack frame ptr
  1375.   mov     bp, sp
  1376.   push    ax
  1377.   push    bx
  1378.   push    dx
  1379.   push    si
  1380.   mov     bx, [bp + 6]            ;get ptr to start of this handler
  1381.           ; (stored in DGROUP)
  1382.   mov     bx, [bx]
  1383.   sub     bx, Start - IntEntry
  1384.  
  1385.   mov     ax, [bp + 2]            ; get QB sub return offset
  1386.   add     ax, 03h                 ; add 3 to compensate for JMP
  1387.           ;  opcode/disp and store in code
  1388.  
  1389.   mov     WORD PTR [bx + HandOff + 1], ax
  1390.  
  1391.   mov     ax, [bp + 4]            ; get QB sub return seg
  1392.           ;  and store in code
  1393.  
  1394.   mov     WORD PTR [bx + HandSeg + 1], ax
  1395.  
  1396.   mov     si, bx                  ;preserve start of code ptr
  1397.  
  1398.   mov     bx, [bp + 8]            ;original int offset ptr to DX
  1399.   mov     dx, WORD PTR [bx]       ; and moved to code storage
  1400.   mov     WORD PTR [si + JmpAddr], dx
  1401.  
  1402.   mov     bx, [bp + 0Ah]          ;original int segment ptr to DX
  1403.   mov     dx, WORD PTR [bx]       ; and moved to code storage
  1404.   mov     WORD PTR [si + JmpAddr + 2], dx
  1405.  
  1406.   mov     bx, [bp + 0Ch]          ;busy flag ptr offset to DX
  1407.           ; and moved to code storage
  1408.   mov     WORD PTR [si + BusyOff + 1], bx
  1409.  
  1410.   mov     bx, [bp + 0Eh]          ;SKGregs ptr to DX, adj to end,
  1411.   mov     dx, WORD PTR [bx]       ; and moved to code storage
  1412.   mov     WORD PTR [si + RegsOff + 1], dx
  1413.  
  1414.   mov     ax, si                  ;start of code ptr in AX
  1415.   add     ax, JmpAddr - IntEntry  ;add distance to offset of OldInt
  1416.           ; and move to actual JMP opcode
  1417.   mov     [si + (JmpAddr - IntEntry) - 2], ax
  1418.  
  1419.   pop     si
  1420.   pop     dx
  1421.   pop     bx
  1422.   pop     ax
  1423.   pop     bp
  1424.   retf    0Ah                     ;return clearing stack
  1425.           ; of five ptr words
  1426.  
  1427. handle  ENDP
  1428.  
  1429.   END     ;this is the end, my FIDO friend, the end...
  1430.  
  1431.  
  1432. --- D'Bridge 1.30/071082
  1433.  * Origin: RadioLink! Columbus, OH (614)766-2162 HST/DS (1:226/140)
  1434.  
  1435.  
  1436. ------------------------------------------------------------------------
  1437.   The QuickBASIC Scrapbook                                  
  1438.                                                             
  1439.   Vol 1, Issue 1                                            January 1993
  1440. ------------------------------------------------------------------------
  1441. ════════════════════════════════════════════════════════════════════════════════
  1442.  Area:    QuickBasic
  1443.   Msg:    #5673
  1444.  Date:    11-21-92 15:01 (Public) 
  1445.  From:    RICHARD DALE             
  1446.  To:      TRENT SHIRLEY            
  1447.  Subject: Registration Encoding    
  1448. ────────────────────────────────────────────────────────────────────────────────
  1449. TS>Im looking for information on implementing REGISTRATION codes into my 
  1450. software.
  1451. TS> The best method I KNOW of is using an algorithm that will encode the 
  1452. persons
  1453. TS>name and BBS name, then sending back the code to the person and tell them 
  1454. to
  1455.  
  1456. This isn't exactly what you're looking for, as it can't be done by the
  1457. individual user.
  1458.  
  1459. ChkSum = 0
  1460. ValidSum = 2874
  1461. Tst$ = Copyright1$
  1462. FOR I% = 1 TO LEN(Tst$)
  1463.     ChkSum = ChkSum + ASC(MID$(Tst$, I%))
  1464. NEXT I%
  1465. PRINT ChkSum
  1466. 'IF ChkSum <> ValidSum THEN CALL LeaveProgram
  1467.  
  1468. For example, Copyright1$ could be "Joe Blow 689453".  Run this, taking
  1469. the value ChkSum returns and put it in the second line.  Then delete
  1470. the line PRINT ChkSum and unremark the last line.
  1471.  
  1472. Anyone using a hex editor to change copyright notices will change the
  1473. value in ChkSum, and the program will terminate.
  1474.  
  1475.  * 1st 1.01 #567 * Pardon me, but would you have any Blue Poupon?
  1476. --- FidoPCB v1.2 [ff013/c]
  1477.  * Origin: Sound Advice - 24 Nodes (816)436-4516 (1:280/333)
  1478.  
  1479.  
  1480. ------------------------------------------------------------------------
  1481.   The QuickBASIC Scrapbook                                  
  1482.                                                             
  1483.   Vol 1, Issue 1                                            January 1993
  1484. ------------------------------------------------------------------------
  1485. ════════════════════════════════════════════════════════════════════════════════
  1486.  Area:    QuickBasic
  1487.   Msg:    #5993
  1488.  Date:    11-21-92 18:06 (Public) 
  1489.  From:    TONY ELLIOTT             
  1490.  To:      PETER BARNEY             
  1491.  Subject: Truncating Files         
  1492. ────────────────────────────────────────────────────────────────────────────────
  1493. Peter,
  1494.  
  1495.  PB> Is there an easy way in QB to truncate a file to a certain length
  1496.  PB> without copying it? 
  1497.  
  1498. Sure .. Not directly via QB, but through an interrupt call. As long as
  1499. the file is opened for RANDOM, BINARY or OUTPUT, this should work fine.
  1500. I wrote it for QBX, but it'll work fine for other version by changing
  1501. the $INCLUDE to QB.BI for VBDOS.BI.
  1502.  
  1503.     DECLARE FUNCTION TruncateFile% (Handle%, NewLength&)
  1504.     DEFINT A-Z
  1505.     REM $INCLUDE: 'qbx.bi'
  1506.     OPEN "TEST.DAT" FOR BINARY AS #1        'Create a file to test
  1507.     A$ = " "
  1508.     PUT #1, 10240, A$                       'Make it 10K long
  1509.     PRINT "File length:"; LOF(1)            'Make sure
  1510.     Handle% = FILEATTR(1, 2)                'Get DOS file handle
  1511.     NewLength& = 5000                       'New length for this file
  1512.     Status% = TruncateFile%(Handle%, NewLength&)    'Do it
  1513.     IF Status% THEN
  1514.         PRINT "DOS Error";Status%;" occurred."
  1515.     ELSE
  1516.         PRINT "New file length:"; LOF(1)
  1517.     END IF
  1518.     CLOSE
  1519.  
  1520. FUNCTION TruncateFile% (Handle%, NewLength&)
  1521.  
  1522.     DIM Reg AS RegTypeX
  1523.  
  1524.     'First, position the file read/write pointer to the place where the
  1525.     'truncation should take place. We can't trust BASIC's SEEK statement
  1526.     'because the movement is sometimes held until the next read/write.
  1527.  
  1528.     Reg.AX = &H4200             'DOS "Set file pointer" function
  1529.     Reg.BX = Handle%
  1530.  
  1531.     'We go through these steps to prevent "overflow" errors when
  1532.     'NewLength& > 32767. The high word of the file position goes in CX
  1533.     'and the low word goes in DX. Since BASIC treats integers and longs
  1534.     '"signed" variables, we need to take to extra steps to prevent
  1535.     'an overflow error as we break the long integer down.
  1536.  
  1537.     DEF SEG
  1538.     Addr% = VARPTR(NewLength&)
  1539.     Reg.CX = CVI(CHR$(PEEK(Addr% + 2)) + CHR$(PEEK(Addr% + 3)))
  1540.     Reg.DX = CVI(CHR$(PEEK(Addr%)) + CHR$(PEEK(Addr% + 1)))
  1541.     CALL InterruptX(&H21, Reg, Reg)
  1542.     IF Reg.Flags AND 1 THEN
  1543.         Status% = Reg.AX
  1544.         GOTO TruncateExit
  1545.     END IF
  1546.  
  1547.     'Now, write 0 bytes.
  1548.     Reg.AX = &H4000                 'Dos "Write file or device"
  1549.     Reg.BX = Handle%
  1550.     Reg.CX = 0                      'Write 0 bytes
  1551.     Reg.DX = 0                      'These are not needed, but make
  1552.     Reg.DS = 0                      ' sure they're zero, just in case
  1553.     CALL InterruptX(&H21, Reg, Reg)
  1554.     IF Reg.Flags AND 1 THEN
  1555.         Status% = Reg.AX
  1556.     END IF
  1557.  
  1558. TruncateExit:
  1559.     TruncateFile% = Status%
  1560.  
  1561. END FUNCTION
  1562.  
  1563. ... Okay, I pulled the pin. What now? Where are you going?
  1564. --- Blue Wave/Max v2.10 [NR]
  1565.  * Origin: Oakland BBS - McDonough, GA - (404) 954-0071 (1:133/706.0)
  1566.  
  1567.  
  1568. ------------------------------------------------------------------------
  1569.   The QuickBASIC Scrapbook                                  
  1570.                                                             
  1571.   Vol 1, Issue 1                                            January 1993
  1572. ------------------------------------------------------------------------
  1573. ════════════════════════════════════════════════════════════════════════════════
  1574.  Area:    QuickBasic
  1575.   Msg:    #6039
  1576.  Date:    11-23-92 22:35 (Public) 
  1577.  From:    RICH GELDREICH           
  1578.  To:      HARVEY PARISIEN          
  1579.  Subject: Gif Decompression Sys
  1580. ────────────────────────────────────────────────────────────────────────────────
  1581. 'Cheap, no frills GIF decompressor for the VGA's 320x200x256 mode.
  1582. 'By Rich Geldreich 1992 (Public domain, use as you wish.)
  1583. 'Sorry for no documentation, I wanted to crunch it to 150 lines...
  1584. DEFINT A-Z
  1585. DIM Prefix(4095), Suffix(4095), OutStack(4095), ShiftOut(8)
  1586.  
  1587. 'The following line is for the QB environment(slow).
  1588. DIM Ybase AS LONG, Powersof2(11) AS LONG, WorkCode AS LONG
  1589. 'For more speed, unremark the next line and remark the one above,
  1590. 'before you compile... (Change back when inside the environment.)
  1591. 'DIM Ybase AS INTEGER, Powersof2(11) AS INTEGER, WorkCode AS INTEGER
  1592.  
  1593. FOR A = 0 TO 7: ShiftOut(8 - A) = 2 ^ A: NEXT
  1594. FOR A = 0 TO 11: Powersof2(A) = 2 ^ A: NEXT
  1595. A$ = COMMAND$: IF A$ = "" THEN INPUT "GIF file"; A$: IF A$ = "" THEN END
  1596. IF INSTR(A$, ".") = 0 THEN A$ = A$ + ".gif"
  1597. OPEN A$ FOR BINARY AS #1
  1598. A$ = "      ": GET #1, , A$
  1599. IF A$ <> "GIF87a" THEN PRINT "Not a GIF87a file.": END
  1600. GET #1, , TotalX: GET #1, , TotalY: GOSUB GetByte
  1601. NumColors = 2 ^ ((A AND 7) + 1): NoPalette = (A AND 128) = 0
  1602. GOSUB GetByte: Background = A
  1603. GOSUB GetByte: IF A <> 0 THEN PRINT "Bad screen descriptor.": END
  1604. IF NoPalette = 0 THEN P$ = SPACE$(NumColors * 3): GET #1, , P$
  1605. DO
  1606.     GOSUB GetByte
  1607.     IF A = 44 THEN
  1608.         EXIT DO
  1609.     ELSEIF A <> 33 THEN
  1610.         PRINT "Unknown extension type.": END
  1611.     END IF
  1612.     GOSUB GetByte
  1613.     DO: GOSUB GetByte: A$ = SPACE$(A): GET #1, , A$: LOOP UNTIL A = 0
  1614. LOOP
  1615. GET #1, , XStart: GET #1, , YStart: GET #1, , XLength: GET #1, , YLength
  1616. XEnd = XStart + XLength: YEnd = YStart + YLength: GOSUB GetByte
  1617. IF A AND 128 THEN PRINT "Can't handle local colormaps.": END
  1618. Interlaced = A AND 64: PassNumber = 0: PassStep = 8
  1619. GOSUB GetByte
  1620. ClearCode = 2 ^ A
  1621. EOSCode = ClearCode + 1
  1622. FirstCode = ClearCode + 2: NextCode = FirstCode
  1623. StartCodeSize = A + 1: CodeSize = StartCodeSize
  1624. StartMaxCode = 2 ^ (A + 1) - 1: MaxCode = StartMaxCode
  1625.  
  1626. BitsIn = 0: BlockSize = 0: BlockPointer = 1
  1627. X = XStart: Y = YStart: Ybase = Y * 320&
  1628.  
  1629. SCREEN 13: DEF SEG = &HA000
  1630. IF NoPalette = 0 THEN
  1631.     OUT &H3C7, 0: OUT &H3C8, 0
  1632.     FOR A = 1 TO NumColors * 3: OUT &H3C9, ASC(MID$(P$, A, 1)) \ 4: NEXT
  1633. END IF
  1634. LINE (0, 0)-(319, 199), Background, BF
  1635. DO
  1636.     GOSUB GetCode
  1637.     IF Code <> EOSCode THEN
  1638.         IF Code = ClearCode THEN
  1639.             NextCode = FirstCode
  1640.             CodeSize = StartCodeSize
  1641.             MaxCode = StartMaxCode
  1642.             GOSUB GetCode
  1643.             CurCode = Code: LastCode = Code: LastPixel = Code
  1644.             IF X < 320 THEN POKE X + Ybase, LastPixel
  1645.             X = X + 1: IF X = XEnd THEN GOSUB NextScanLine
  1646.         ELSE
  1647.             CurCode = Code: StackPointer = 0
  1648.             IF Code > NextCode THEN EXIT DO 'bad GIF if this happens
  1649.             IF Code = NextCode THEN
  1650.                 CurCode = LastCode
  1651.                 OutStack(StackPointer) = LastPixel
  1652.                 StackPointer = StackPointer + 1
  1653.             END IF
  1654.  
  1655.             DO WHILE CurCode >= FirstCode
  1656.                 OutStack(StackPointer) = Suffix(CurCode)
  1657.                 StackPointer = StackPointer + 1
  1658.                 CurCode = Prefix(CurCode)
  1659.             LOOP
  1660.  
  1661.             LastPixel = CurCode
  1662.             IF X < 320 THEN POKE X + Ybase, LastPixel
  1663.             X = X + 1: IF X = XEnd THEN GOSUB NextScanLine
  1664.  
  1665.             FOR A = StackPointer - 1 TO 0 STEP -1
  1666.                 IF X < 320 THEN POKE X + Ybase, OutStack(A)
  1667. <<-to be continued on next message->>
  1668.  
  1669. --- MsgToss 2.0b
  1670.  * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
  1671.  
  1672.  
  1673. ------------------------------------------------------------------------
  1674.   The QuickBASIC Scrapbook                                  
  1675.                                                             
  1676.   Vol 1, Issue 1                                            January 1993
  1677. ------------------------------------------------------------------------
  1678. ════════════════════════════════════════════════════════════════════════════════
  1679.  Area:    QuickBasic
  1680.   Msg:    #6040
  1681.  Date:    11-23-92 22:39 (Public) 
  1682.  From:    RICH GELDREICH           
  1683.  To:      HARVEY PARISIEN          
  1684.  Subject: A Gif decoder/p2         
  1685. ────────────────────────────────────────────────────────────────────────────────
  1686. <<Part 2 Starts Here>>
  1687.                 X = X + 1: IF X = XEnd THEN GOSUB NextScanLine
  1688.             NEXT
  1689.  
  1690.             IF NextCode < 4096 THEN
  1691.                 Prefix(NextCode) = LastCode
  1692.                 Suffix(NextCode) = LastPixel
  1693.                 NextCode = NextCode + 1
  1694.                 IF NextCode > MaxCode AND CodeSize < 12 THEN
  1695.                     CodeSize = CodeSize + 1
  1696.                     MaxCode = MaxCode * 2 + 1
  1697.                 END IF
  1698.             END IF
  1699.             LastCode = Code
  1700.         END IF
  1701.     END IF
  1702. LOOP UNTIL DoneFlag OR Code = EOSCode
  1703. BEEP
  1704. A$ = INPUT$(1)
  1705. END
  1706.  
  1707. GetByte: A$ = " ": GET #1, , A$: A = ASC(A$): RETURN
  1708.  
  1709. NextScanLine:
  1710.     IF Interlaced THEN
  1711.         Y = Y + PassStep
  1712.         IF Y >= YEnd THEN
  1713.             PassNumber = PassNumber + 1
  1714.             SELECT CASE PassNumber
  1715.             CASE 1: Y = 4: PassStep = 8
  1716.             CASE 2: Y = 2: PassStep = 4
  1717.             CASE 3: Y = 1: PassStep = 2
  1718.             END SELECT
  1719.         END IF
  1720.     ELSE
  1721.         Y = Y + 1
  1722.     END IF
  1723.     X = XStart: Ybase = Y * 320&: DoneFlag = Y > 199
  1724. RETURN
  1725. GetCode:
  1726.     IF BitsIn = 0 THEN GOSUB ReadBufferedByte: LastChar = A: BitsIn = 8
  1727.     WorkCode = LastChar \ ShiftOut(BitsIn)
  1728.     DO WHILE CodeSize > BitsIn
  1729.         GOSUB ReadBufferedByte: LastChar = A
  1730.         WorkCode = WorkCode OR LastChar * Powersof2(BitsIn)
  1731.         BitsIn = BitsIn + 8
  1732.     LOOP
  1733.     BitsIn = BitsIn - CodeSize
  1734.     Code = WorkCode AND MaxCode
  1735. RETURN
  1736. ReadBufferedByte:
  1737.     IF BlockPointer > BlockSize THEN
  1738.         GOSUB GetByte: BlockSize = A
  1739.         A$ = SPACE$(BlockSize): GET #1, , A$
  1740.         BlockPointer = 1
  1741.     END IF
  1742.     A = ASC(MID$(A$, BlockPointer, 1)): BlockPointer = BlockPointer + 1
  1743. RETURN
  1744.  
  1745. <<-Cut Here->>
  1746.  
  1747.     There you go!
  1748.  
  1749.     This is a more efficient version of my first GIF decoder... It can
  1750. decode 320x200x256 GIFs at an acceptable speed(MUCH faster than my
  1751. original decoder), but there are still a few optimizations I left out to
  1752. keep it simple.
  1753.  
  1754.     Rich
  1755.  
  1756. --- MsgToss 2.0b
  1757.  * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
  1758.  
  1759.  
  1760. ------------------------------------------------------------------------
  1761.   The QuickBASIC Scrapbook                                  
  1762.                                                             
  1763.   Vol 1, Issue 1                                            January 1993
  1764. ------------------------------------------------------------------------
  1765. ════════════════════════════════════════════════════════════════════════════════
  1766.  Area:    QuickBasic
  1767.   Msg:    #7056
  1768.  Date:    11-24-92 21:34 (Public) 
  1769.  From:    JIM HARRE                
  1770.  To:      TOM HAMMOND              
  1771.  Subject: HELP!  Unsigned #'s      
  1772. ────────────────────────────────────────────────────────────────────────────────
  1773. In a message of <19 Nov 92  19:40:00>, Tom Hammond (1:289/15) writes:
  1774.  
  1775.  >I was confused that the value of this variable appeared to be a negative
  1776.  >number.  Looking into the actual file, I found that the two bytes were
  1777.  >&H73 and &H84.  I assumed that the two bytes were stored LOW HIGH, so I
  1778.  >reversed their position and ran them through a HEX-to-DEC calculator to
  1779.  >obtain a confirmation of what I'd previously printed out.  The
  1780.  >calculated value was 33907....  NOT the -31629 I'd come to expect.
  1781.  > 
  1782.  >Now I'm REALLY confused!  Would anyone care to lend a helping hand and
  1783.  
  1784. Remember that QB is always going to assume an integer is signed, that's why 
  1785. you got -31629.  Try this:
  1786.  
  1787.      num% = &H8473            'your number
  1788.      PRINT num%               'shows -31629
  1789.      IF num% < 0 THEN         'QB thinks it is a signed variable
  1790.           PRINT num% + 65536  'shows 33907
  1791.      END IF
  1792.  
  1793. Hey, there's your magic 33907!  Of course you can't store that in an integer 
  1794. since the maximum value for a signed short integer is +32767.  You CAN 
  1795. straighten it out with a long integer like this:
  1796.  
  1797.      num% = &H8473
  1798.      lnum& = num%
  1799.      IF lnum& < 0 THEN lnum& = lnum& + 65536
  1800.      PRINT lnum&
  1801.  
  1802. Moving between signed and unsigned numbers can be hazardous to the health of 
  1803. your hair!  {-)
  1804.  
  1805.      <*> Jim
  1806.  
  1807.  
  1808. --- QM v1.00
  1809.  * Origin: * EMC/80 * St Louis MO (314)843-0001 -=<HST/ds>=- (1:100/555.0)
  1810.  
  1811.  
  1812. ------------------------------------------------------------------------
  1813.   The QuickBASIC Scrapbook                                  
  1814.                                                             
  1815.   Vol 1, Issue 1                                            January 1993
  1816. ------------------------------------------------------------------------
  1817. ════════════════════════════════════════════════════════════════════════════════
  1818.  Area:    QuickBasic
  1819.   Msg:    #7574
  1820.  Date:    11-19-92 04:22 (Public) 
  1821.  From:    WALTON DELL              
  1822.  To:      DAVID KOUTS              
  1823.  Subject: Paint Program
  1824. ────────────────────────────────────────────────────────────────────────────────
  1825.  -=> Quoting David Kouts to All <=-
  1826.  
  1827.  DK> I'm kind of an amateur QBASIC programmer who likes to do a
  1828.  DK> lot with graphics. I'm working on a (kind-of) drawing program, and was
  1829.  DK> wondering if anyone could tell me how I could get input from a mouse?
  1830.  DK> What commands would I use?
  1831.  
  1832. Here's a very simple paint program:
  1833.  
  1834. 'This doesn't work with DOS 5 QBasic!
  1835. DEFINT A-Z
  1836. '$INCLUDE: 'QB.BI'  'do DIR \QB.BI /s if you need path
  1837. DECLARE SUB PrintScrn ()
  1838. DECLARE SUB MouseNow (leftbutton%, rightbutton%, xmouse%, ymouse%)
  1839. DECLARE SUB MouseShow ()
  1840. DECLARE SUB MouseHide ()
  1841.  
  1842. SUB MouseHide
  1843. DIM InRegs AS RegType, OutRegs AS RegType
  1844. InRegs.ax = 2
  1845. Interrupt 51, InRegs, OutRegs
  1846. END SUB
  1847.  
  1848. SUB MouseNow (leftbutton%, rightbutton%, xmouse%, ymouse%)
  1849. DIM InRegs AS RegType, OutRegs AS RegType
  1850. InRegs.ax = 3: leftbutton% = 0: rightbutton% = 0
  1851. Interrupt 51, InRegs, OutRegs
  1852. IF OutRegs.bx = 1 THEN leftbutton% = -1
  1853. IF OutRegs.bx = 2 THEN rightbutton% = -1
  1854. IF OutRegs.bx = 3 THEN leftbutton% = -1: rightbutton% = -1
  1855. xmouse% = OutRegs.cx: ymouse% = OutRegs.dx
  1856. END SUB
  1857.  
  1858. SUB MouseShow
  1859. DIM InRegs AS RegType, OutRegs AS RegType
  1860. InRegs.ax = 1
  1861. Interrupt 51, InRegs, OutRegs
  1862. END SUB
  1863.  
  1864. SUB PrintScrn
  1865. DIM InRegs AS RegType, OutRegs AS RegType
  1866. Interrupt 5, InRegs, OutRegs
  1867. END SUB
  1868.  
  1869. SCREEN 0, 0, 0, 0: CLS : COLOR 3: MouseShow
  1870. DO
  1871.   MouseNow Left, Right, x, y
  1872.   IF Left THEN
  1873.     MouseHide
  1874.     LOCATE y, x: PRINT CHR$(219);
  1875.     MouseShow
  1876.   ELSEIF Right THEN
  1877.     MouseHide
  1878.     LOCATE y, x: PRINT " ";
  1879.     MouseShow
  1880.   END IF
  1881.   KeyPress$ = UCASE$(INKEY$)
  1882.   IF KeyPress$ = "P" THEN PrintScrn
  1883. LOOP UNTIL KeyPress$ = "Q"
  1884. MouseHide
  1885. END
  1886.  
  1887.  DK> I'm having to do all my programming on a word-processor and
  1888.  DK> taking it to my grandparent's house to test it, since this dinky 256k
  1889.  DK> computer of mine won't run QB. Is there any way I can get QB to run on
  1890.  DK> this thing?
  1891.  
  1892.   Not that I know of, but I'd HIGHLY recommend that you either upgrade
  1893. your memory, find a cheap (less than $15) XT motherboard (at least) if
  1894. you have IBM compatible parts, or buy a whole new system.
  1895.  
  1896. Walton Dell
  1897.  
  1898. P.S. I love to help beginners.
  1899.  
  1900.  
  1901. ... Misspelled?  No way!  I have an error-correcting modem.
  1902.     Blue Wave/QWK v2.10
  1903.  
  1904.  
  1905. --- WM v2.01/92-0162
  1906.  * Origin: The Huff & Puff BBS (602)-996-0033 USR DS (1:114/144)
  1907.  
  1908.  
  1909. ------------------------------------------------------------------------
  1910.   The QuickBASIC Scrapbook                                  
  1911.                                                             
  1912.   Vol 1, Issue 1                                            January 1993
  1913. ------------------------------------------------------------------------
  1914. ════════════════════════════════════════════════════════════════════════════════
  1915.  Area:    QuickBasic
  1916.   Msg:    #7733
  1917.  Date:    11-23-92 14:49 (Public) 
  1918.  From:    JOHN GALLAS              
  1919.  To:      MIKE KERR                
  1920.  Subject: Preserving orig. COMMAND$
  1921. ────────────────────────────────────────────────────────────────────────────────
  1922. MK>The problem I'm having now, is similar, yet not.  Sorry, I won't be
  1923. MK>cryptic any more! :-)   I have just written a program that will print
  1924.  
  1925. MK>C:\QBASIC\PP.BAS
  1926. MK>Which is EXACTLY what I want.  I get this from MID$(COMMAND$,4).  So,
  1927. MK>what's the problem?  When I compile the program, all that gets read in
  1928. MK>is:
  1929. MK>QBASIC\PP.BAS
  1930.  
  1931. <etc etc>
  1932.  
  1933. Heres a routine that'll use interrupts to read in the command line
  1934. entered from DOS.  It shouldn't take off any characters, and it even
  1935. preserves upper/lower case.     
  1936.  
  1937.  
  1938. '=================================================================
  1939. 'Date: 04-11-91
  1940. 'From: BRENT ASHLEY
  1941. 'Subj: ORIGINAL COMMAND LINE; preserving lower case
  1942. 'Conf: QBASIC (62)
  1943.  
  1944. 'The command line as entered at the DOS prompt, in all its mixed-case
  1945. 'splendour, is found at offset &H81 of the program's PSP (Program Segment
  1946. 'Prefix), with the length of the command string at offset &H80 of the
  1947. 'PSP.
  1948. '
  1949. 'Finding your PSP from within QuickBASIC entails Interrupt calls.
  1950. '   ~~~~~~~~~
  1951. 'That same area of the PSP, however, is also the default disk transfer
  1952. 'area for the program (or is it the default File Control Block? - I don't
  1953. 'have my references handy) At any rate, I suspect QB always defines its
  1954. 'own DTAs and FCBs, so the data won't be overwritten, but this cannot
  1955. 'always be guaranteed.  It would be best, therefore, if you were to get
  1956. 'this info, to get it as early in the program's execution as possible,
  1957. 'especially before any file I/O.
  1958. '======================================================================
  1959.  
  1960. DECLARE FUNCTION CmdLine$ ()
  1961. DEFINT A-Z
  1962. ' $INCLUDE: 'qb.bi'
  1963.  
  1964. PRINT "Here's the original command line:"
  1965. PRINT "["; CmdLine$; "]"
  1966.  
  1967. END
  1968.  
  1969. FUNCTION CmdLine$
  1970.   '
  1971.   ' CmdLine - returns original command line
  1972.   '
  1973.   DIM Regs AS RegType
  1974.   STATIC CmdLen, CmdBuild$, i
  1975.   '
  1976.   ' DOS Interrupt 21h service 62h returns the segment
  1977.   ' address of the running program's PSP in the bx register.
  1978.   '
  1979.   Regs.ax = &H6200
  1980.   CALL Interrupt(&H21, Regs, Regs)
  1981.   DEF SEG = Regs.BX
  1982.   '
  1983.   ' The command line's length is found at offset 80h of the PSP
  1984.   ' and the actual command line starts at 81h
  1985.   '
  1986.   CmdBuild$ = ""
  1987.   CmdLen = PEEK(&H80)
  1988.   FOR i = 1 TO CmdLen
  1989.     CmdBuild$ = CmdBuild$ + CHR$(PEEK(&H80 + i))
  1990.   NEXT
  1991.   '
  1992.   ' restore BASIC data segment and return data
  1993.   '
  1994.   DEF SEG
  1995.   CmdLine$ = CmdBuild$
  1996. END FUNCTION
  1997.  
  1998. The only problem is, you can't change the command line from within the
  1999. QB environment, but if you're always running from an exe, it'll work
  2000. fine.
  2001.  
  2002.  * OLX 2.1 TD * I don't have a life, I have a BBS..
  2003. --- RyPacker v2.5b
  2004.  * Origin: The Ghost Mode - An RyBBS System!  (612)-688-0026 (1:282/3006)
  2005.  
  2006.  
  2007. ------------------------------------------------------------------------
  2008.   The QuickBASIC Scrapbook                                  
  2009.                                                             
  2010.   Vol 1, Issue 1                                            January 1993
  2011. ------------------------------------------------------------------------
  2012. ════════════════════════════════════════════════════════════════════════════════
  2013.  Area:    QuickBasic
  2014.   Msg:    #9093
  2015.  Date:    11-25-92 18:09 (Public) 
  2016.  From:    GEORGE BATALIAS          
  2017.  To:      DICK DENNISON            
  2018.  Subject: 19200+                   
  2019. ────────────────────────────────────────────────────────────────────────────────
  2020. DD>    > Are you doing 14.4 with OPEN COM?
  2021.  
  2022. DD>   JH> NAK! (G). QB's Open stops at 9600. Using a neat third-party gizmo 
  2023. (th
  2024.  
  2025. DD>   NAK.  You can use OPEN to 19200,  Try it.  (And you can poke it to 115k
  2026. DD>   if you need to.)
  2027.  
  2028.  
  2029. Yea. Some of my DOORS run at 19200. Using qb45. Never saw them
  2030. run faster! Whats the secret? I don't use qbser or add on library. Just
  2031. straight qb code from CATPATCH.BAS part of it goes like this:
  2032.  
  2033.  IF baud = 2400 then
  2034.   bp$ = "2400"
  2035. ' (cut out for shortness)
  2036.  IF baud = 19200 then
  2037.   bp$ = "19200"
  2038.   END IF
  2039.  
  2040. 'baud is the baud rate passed from the bbs dropfile
  2041.  
  2042. '  maybe i could just add:
  2043.  
  2044.  
  2045.   IF baud = 38400 then
  2046.    bp$ = "38400"
  2047.   IF baud = 76800 then
  2048.    bp$ = ""76800"
  2049.   ' ETC up to 14,400
  2050.  
  2051.  open com1 + ":" + bp$ + par$ for random as #3
  2052.  
  2053. "Whad du ya think?"
  2054. I'm not to familiar with POKE, PEEK, INTERUPTS, ETC
  2055.  
  2056.    -----
  2057.  
  2058. For anyone else writing a door (or for outputing over the modem) that
  2059. doesn't want to spend the $$$ then i would recommend CATPATCH (uses
  2060. CALLINFO.BBS) or the new DPATCH (uses door.sys). Its FREE! Complete
  2061. source is included. (thats all there is,  QB code!). I have modified
  2062. this code and i am a beginner. Works like a charm!. I bet someone could
  2063. modify it even for ANSI music(over the modem).....(G)   any takers????
  2064.  
  2065. Well, anyway call Jim Brewers BBS (GULF COAST BBS)and you can get these
  2066. bas files ( i believe they are CATPATCH.ZIP and DPATCH.ZIP). He says he
  2067. doesn't support it anymore but they are there for DLD. (Thanks JIM!)
  2068.  
  2069. QB does go to 19200! ..... maybe more!
  2070. L8TR
  2071.                          GB
  2072.  
  2073.  * OLX 2.2 * CORVETTE BBS...1-702-431-2284...Las Vegas...FS files...
  2074.  
  2075.  
  2076. --- WM v2.04/91-0049
  2077.  * Origin: Reservation Only! Las Vegas,Nv~702-898-8630~ (1:209/721)
  2078.  
  2079.  
  2080. ------------------------------------------------------------------------
  2081.   The QuickBASIC Scrapbook                                  
  2082.                                                             
  2083.   Vol 1, Issue 1                                            January 1993
  2084. ------------------------------------------------------------------------
  2085. ════════════════════════════════════════════════════════════════════════════════
  2086.  Area:    QuickBasic
  2087.   Msg:    #9225
  2088.  Date:    11-25-92 13:24 (Public) 
  2089.  From:    PETER BARNEY             
  2090.  To:      MICHAEL BAILEY           
  2091.  Subject: Variable Sharing in QB45 
  2092. ────────────────────────────────────────────────────────────────────────────────
  2093.  > Thanks for the response, but my problem is sharing a typed record
  2094.  > variable (ie COMMON SHARED RAC AS RACMAST, where RACMAST is a record
  2095.  > variable defined in a TYPE statement) between SUB proceedures in
  2096.  > different modules.
  2097.  
  2098. I couldn't find a problem... Try this:
  2099.  
  2100. '---------This is MODULE1.BAS---------
  2101. DECLARE SUB GetName ()
  2102. DECLARE SUB ChangeName ()
  2103.  
  2104. TYPE RacMast
  2105.     name    AS STRING * 10
  2106.     age     AS INTEGER
  2107. END TYPE
  2108.  
  2109. COMMON SHARED Rac AS RacMast
  2110.  
  2111. CALL GetName        'sub in this module
  2112.  
  2113. PRINT Rac.name
  2114. PRINT Rac.age
  2115. END
  2116.  
  2117. SUB GetName
  2118.     Rac.name = "peter"
  2119.     Rac.age = 20
  2120.     CALL ChangeName     'sub in other module
  2121. END SUB
  2122.  
  2123. '---------This is MODULE2.BAS---------
  2124. TYPE RacMast
  2125.     Name    AS STRING * 10
  2126.     Age     AS INTEGER
  2127. END TYPE
  2128.  
  2129. COMMON SHARED Rac AS RacMast
  2130.  
  2131. SUB ChangeName
  2132.     Rac.Name = "Mike"
  2133.     Rac.Age = 25
  2134. END SUB
  2135.  
  2136.  
  2137. As you can see, the SUB ChangeName changes the data in Rac and returns it to 
  2138. the calling SUB GetName, which in turn returns it to the module-level code in 
  2139. MODULE1.BAS
  2140.  
  2141. If I'm missing something, or you have more questions, let me know.
  2142.  
  2143. --- FMail 0.92
  2144.  * Origin: Pete's Place (1:234/35.1)
  2145.  
  2146.  
  2147. ------------------------------------------------------------------------
  2148.   The QuickBASIC Scrapbook                                  
  2149.                                                             
  2150.   Vol 1, Issue 1                                            January 1993
  2151. ------------------------------------------------------------------------
  2152. ════════════════════════════════════════════════════════════════════════════════
  2153.  Area:    QuickBasic
  2154.   Msg:    #10851
  2155.  Date:    11-26-92 14:25 (Public) 
  2156.  From:    JOHN GALLAS              
  2157.  To:      DAVE WILLIAMS            
  2158.  Subject: Sequential Data Deletn               
  2159. ────────────────────────────────────────────────────────────────────────────────
  2160. DW> I am writing a program for a small business. It keeps a list ofrecords.
  2161. DW>Sometimes one or more records will need to be eliminated.
  2162. DW>Is there a way to delete individual records from a file?  And then
  2163. DW>renumber the remaining records?
  2164. DW>   Each record is for an account.  So each has its 1st variable as:
  2165. DW>  accnt.name   Could I have the program check to see if accnt.name
  2166. DW>  = space$(8), and if so delete that record?
  2167. DW>  Thanks for any help. I'm pretty new in Qbasic and this is obviouslya
  2168. DW>pretty `basic' question
  2169.  
  2170. The only way that I know of to delete records from a random file is to
  2171. read it in, and output a second file, like this:
  2172.  
  2173. OPEN "ACCOUNTS.DAT" FOR RANDOM AS #1 LEN = LEN(Accnt)
  2174. OPEN "$$$$ii$i.uuu" FOR RANDOM AS #2 LEN = LEN(Accnt)  'dummy file
  2175.  
  2176. TotalRecords = LOF(1) \ LEN(Accnt)
  2177.  
  2178. Count = 0
  2179.  
  2180. FOR x = 1 TO TotalRecords
  2181.  
  2182.   GET #1, x, Accnt
  2183.   IF Accnt.name <> SPACE$(8) THEN
  2184.      'if this record isn't blank then save it to the new file
  2185.      Count = Count + 1
  2186.      PUT #2, Count, Accnt
  2187.   END IF
  2188.  
  2189. NEXT x
  2190.  
  2191. CLOSE 1, 2
  2192.  
  2193. KILL "ACCOUNTS.DAT"
  2194. NAME "$$$$i$ii.uuu" AS "ACCOUNTS.DAT"
  2195.  
  2196. 'now all the records with blank names should be gone.
  2197.  
  2198.  * OLX 2.1 TD * It's not "crippleware". It's "functionally challenged".
  2199. --- RyPacker v2.5b
  2200.  * Origin: The Ghost Mode - An RyBBS System!  (612)-688-0026 (1:282/3006)
  2201.  
  2202.  
  2203. ------------------------------------------------------------------------
  2204.   The QuickBASIC Scrapbook                                  
  2205.                                                             
  2206.   Vol 1, Issue 1                                            January 1993
  2207. ------------------------------------------------------------------------
  2208. ════════════════════════════════════════════════════════════════════════════════
  2209.  Area:    QuickBasic
  2210.   Msg:    #10994
  2211.  Date:    11-28-92 05:52 (Public) 
  2212.  From:    DICK DENNISON            
  2213.  To:      DAVID COLSTON            
  2214.  Subject: 19200 baud in QB
  2215. ────────────────────────────────────────────────────────────────────────────────
  2216. DD>NAK.  You can use OPEN to 19200,  Try it.  (And you can poke it to 115k
  2217. DD>if you need to.)
  2218.  
  2219. DC> Well, don't stop there. Please give details.
  2220.   
  2221. Use the straight OPEN COM statement for 19200.  To go higher you can
  2222. use this code (originally from Donn Bly):
  2223.  
  2224. SUB baudlatch   'enables 38400 baud  want to put in com3 and com4 support
  2225. 'NewBaud$ = "38400"
  2226. 'BaudNum% = 3   'for 38.4
  2227. 'BaudNum% = 2  'for 56000
  2228. BaudNum% = 1 'for 115K
  2229.  
  2230.  
  2231. SELECT CASE Port$
  2232.         CASE "COM1:"
  2233.                 BaseAddress% = &H3F8
  2234.         CASE "COM2:"
  2235.                 BaseAddress% = &H2F8
  2236.         CASE "COM3:"
  2237.                 BaseAddress% = &H3E8
  2238.         CASE "COM4:"
  2239.                 BaseAddress% = &H2E8
  2240. END SELECT
  2241.         OldLSR% = INP(BaseAddress% + 3)
  2242.         OUT (BaseAddress% + 3), (OldLSR% OR &H80)   ' Enable the Divisor L
  2243. atch
  2244.         OUT (BaseAddress% + 0), (BaudNum% MOD &HFF) ' Lo Byte of Baud Rate
  2245.         OUT (BaseAddress% + 1), (BaudNum% \ &H100)  ' Hi Byte of baud Rate
  2246.         OUT (BaseAddress% + 3), OldLSR%             ' Disable Divisor Latc
  2247. h
  2248. END SUB
  2249.   'Sorry for the line wrap.  Enjoy.
  2250.  
  2251. --- VP [DOS] V4.09e
  2252.  * Origin: The MailMan  (914)374-3903 NY Quick Share Pt #7 *HST (1:272/34)
  2253.  
  2254.  
  2255. ------------------------------------------------------------------------
  2256.   The QuickBASIC Scrapbook                                  
  2257.                                                             
  2258.   Vol 1, Issue 1                                            January 1993
  2259. ------------------------------------------------------------------------
  2260. ════════════════════════════════════════════════════════════════════════════════
  2261.  Area:    QuickBasic
  2262.   Msg:    #12296
  2263.  Date:    11-29-92 23:10 (Public) 
  2264.  From:    AARON LAPIKAS            
  2265.  To:      LUKE MERRILL             
  2266.  Subject: Ctrl-Alt-Del Trap        
  2267. ────────────────────────────────────────────────────────────────────────────────
  2268. > an educational game for children.  Can anyone give me a hint as to
  2269. > the best way to trap or disable the Ctrl-Alt-Del combination in QB.
  2270.  
  2271. Hi Luke!
  2272.  
  2273. I'm sure that this isn't the best way, and I'm sure that others will tell you 
  2274. better ways of doing it, but my way will work.  Here is an example:
  2275.  
  2276. KEY 15, CHR$(&H04)+CHR$(38)     'Define a key for CTRL-ALT
  2277. KEY(15) ON                      'Turn the key on
  2278.  
  2279. ON KEY(15) GOSUB TrapKey
  2280.  
  2281. DO
  2282. LOOP                            'Idle loop, used just as an example
  2283.  
  2284.  
  2285. TrapKey:
  2286.                                 'When the CTRL-ALT combination is pressed,
  2287. RETURN                          'the program branches to here, then returns
  2288.                                 'to the program.
  2289.  
  2290.  
  2291. The only problem with this method is that the CAP-LOCK, SCROLL-LOCK, and NUM- 
  2292. LOCK must be off.  However, you can POKE to certain memory locations and shut 
  2293. them off at the beginning of your program in case they were on. Again, this 
  2294. is not the best way to do this, but if no one else helps you, it's a starting 
  2295. place.
  2296.  
  2297. Aaron
  2298.  
  2299. --- FMail 0.90
  2300.  * Origin: Send your Finleys and Hershisers to Sharon, PA. (1:2601/506.1)
  2301.  
  2302.  
  2303. ------------------------------------------------------------------------
  2304.   The QuickBASIC Scrapbook                                  
  2305.                                                             
  2306.   Vol 1, Issue 1                                            January 1993
  2307. ------------------------------------------------------------------------
  2308. ════════════════════════════════════════════════════════════════════════════════
  2309.  Area:    QuickBasic
  2310.   Msg:    #12646
  2311.  Date:    11-29-92 12:15 (Public) 
  2312.  From:    RICK PEDLEY              
  2313.  To:      SCOTT WUNSCH             
  2314.  Subject: Accessing COM3/4:        
  2315. ────────────────────────────────────────────────────────────────────────────────
  2316.  On 11-27-92 Scott Wunsch wrote to All... 
  2317.  
  2318.  SW> Salutations, All! 
  2319.  SW>  
  2320.  SW>   I seems to me that I've seen a post here about COM3/4.   
  2321.  SW> All that was done was simply switching the addresses in low  
  2322.  SW> memory, and then 3 & 4 became 1 & 2. ;) Does anybody still  
  2323.  SW> have this?  Or at least have the PEEK/POKE addresses  
  2324.  SW> necessary? 
  2325.  
  2326. ---------------------------------------------------------------------------- 
  2327. ' DIAL    BAS : Dial a phone number on the screen 
  2328. ' author .....: Dick Dennison [74270,3636] 1:272/34 914-374-3903 *hst 24 hrs 
  2329. ' supports ...: COM1 - COM4 
  2330. ' syntax .....: DIAL portnum% 
  2331. ' includes ...: None 
  2332. ' notes ......: Move the cursor with the arrow keys to the phone number 
  2333. '             : Press the spacebar and move the right arrow key across 
  2334. '             : the number and press Enter 
  2335. '             : Uses Basic's OPEN COMx commands 
  2336. ' cost .......: Free = Credit where credit due 
  2337. '             : Do not use as is for commercial use - may not be resold 
  2338. '             : May not be rebundled without prior written consent 
  2339. ' dated ......: 10/19/91,10/9/92 
  2340. ' credits ....: Thanks to Mike Welch for CLIPMSG, and Pete Petrakis for his 
  2341. '             : notes on Com Port swapping. 
  2342.  
  2343. DECLARE SUB Hangup (port%) 
  2344. DECLARE SUB Getnum (row%, Col%, markit%, port%) 
  2345. DECLARE SUB Setup (port%) 
  2346.  
  2347. LOCATE 1, 1 
  2348.  
  2349. doscolor% = SCREEN(1, 1, -1) 
  2350. fg% = doscolor% AND &HF 
  2351. bg% = doscolor% / &H10 AND 6   '&H7 - 1 
  2352.  
  2353. COLOR 0, 7 
  2354. LOCATE 24, 1 
  2355. PRINT "     Move the cursor to the beginning of the phone number and press_ 
  2356.        Space       " 'line is wrapped 
  2357. PRINT "                             DIALX from Dick Dennison"; 
  2358. GOTO Here 
  2359. LOCATE 10, 1 
  2360. IF VAL(COMMAND$) < 1 OR VAL(COMMAND$) > 4 THEN      'Get the portnum% 
  2361.      PRINT "Port number must be on command line" 
  2362.      END 
  2363. ELSE port% = VAL(COMMAND$) 
  2364. END IF 
  2365. Here: 
  2366. port% = 2          'Hard code the port here 
  2367.                     
  2368. '================================================== 
  2369. 'Setup some special key functions 
  2370. CR$ = CHR$(13) 
  2371. Nul$ = CHR$(0) 
  2372. ArrowLt$ = Nul$ + CHR$(75) 
  2373. ArrowRt$ = Nul$ + CHR$(77) 
  2374. ArrowUp$ = Nul$ + CHR$(72) 
  2375. ArrowDn$ = Nul$ + CHR$(80) 
  2376. EndKey$ = Nul$ + CHR$(79) 
  2377. Esc$ = CHR$(27) 
  2378. BackSp$ = CHR$(8) 
  2379. Home$ = Nul$ + CHR$(71) 
  2380. SpaceBar$ = CHR$(32) 
  2381. '=================================================== 
  2382.  
  2383. 'Save vectors at bios Addresses for Com1-Com2 
  2384. DEF SEG = 0 
  2385.   OldPort1H = PEEK(&H400) 
  2386.   OldPort1L = PEEK(&H401) 
  2387.   OldPort2H = PEEK(&H402) 
  2388.   OldPort2L = PEEK(&H403) 
  2389. DEF SEG 
  2390.  
  2391. '================================================================== 
  2392. 'Move cursor around 
  2393. DO                         'This section lets the user move 
  2394.  In$ = INKEY$             'move the cursor around on the screen 
  2395.  SELECT CASE In$          'to the beginning of the phone number 
  2396.   CASE CHR$(48) TO CHR$(57) 
  2397.      numflag% = -1 
  2398.      count% = count% + 1 
  2399.      markit% = -1 
  2400.      PRINT In$; 
  2401.   CASE CR$ 
  2402.     IF markit% THEN       'A CR signals the end of the highlight 
  2403.      row% = CSRLIN 
  2404.      Col% = POS(0) - count% 
  2405.     IF numflag% THEN count% = count% - 1 
  2406.      EXIT DO 
  2407.     END IF 
  2408.   CASE Esc$                'END 
  2409.     END 
  2410.   CASE Home$               'Goto the beginning of the line 
  2411.      LOCATE , 1 
  2412.   CASE EndKey$             'Goto the end of the line 
  2413.      LOCATE , 80 
  2414.   CASE ArrowUp$            'UpArrow 
  2415.      x% = CSRLIN 
  2416.      IF x% > 1 THEN LOCATE x% - 1 
  2417.   CASE ArrowDn$            'DownArrow 
  2418.      x% = CSRLIN 
  2419.      IF x% < 25 THEN LOCATE x% + 1 
  2420.   CASE ArrowLt$                                 'LeftArrow 
  2421.      IF POS(0) > 1 THEN LOCATE , POS(0) - 1 
  2422.      IF markit% THEN count% = count% - 1       'If markit% then ' ' was 
  2423.                                                ' pressed 
  2424.   CASE ArrowRt$                             'RightArrow 
  2425.       
  2426.      IF markit% THEN 
  2427.           count% = count% + 1               'If markit% then ' ' was pressed 
  2428.           row% = CSRLIN: Col% = POS(0) 
  2429.           a% = SCREEN(row%, Col%) 
  2430.           PRINT CHR$(a%); 
  2431.      ELSE 
  2432.           IF POS(0) < 80 THEN LOCATE , POS(0) + 1 
  2433.      END IF 
  2434.   CASE BackSp$ 
  2435.      IF POS(0) > 1 THEN         'Backspace with delete 
  2436.          count% = count% - 1 
  2437.          LOCATE , POS(0) - 1 
  2438.          PRINT " "; 
  2439.          LOCATE , POS(0) - 1 
  2440.      END IF 
  2441.   CASE SpaceBar$ 
  2442.      IF markit% THEN 
  2443.           count% = count% + 1          'If markit% then ' ' was pressed 
  2444.           row% = CSRLIN: Col% = POS(0) 
  2445.           a% = SCREEN(row%, Col%) 
  2446.           PRINT CHR$(a%); 
  2447.      ELSE 
  2448.           BEEP 
  2449.           markit% = -1                      'Flag set for marking number 
  2450.      END IF 
  2451.  END SELECT 
  2452.  LOCATE , , 1                   'Keep cursor flashing 
  2453. LOOP 
  2454. '====================================================================== 
  2455.  
  2456.          'Get the phone number off the screen 
  2457. Getnum row%, Col%, count%, port% 
  2458.  
  2459.          'Restore old vectors 
  2460. CLOSE 1 
  2461.  
  2462. 'DEF SEG = 0 
  2463. '   POKE &H400, OldPort1H 
  2464. '   POKE &H401, OldPort1L 
  2465. '   POKE &H402, OldPort2H 
  2466. '  POKE &H403, OldPort2L 
  2467. 'DEF SEG 
  2468.  
  2469. COLOR fg%, bg% 
  2470. END 
  2471.  
  2472. SUB Getnum (row%, Col%, markit%, port%) 
  2473. GOTO Here1: 
  2474. IF row% < 1 THEN row% = 1 
  2475. IF Col% < 1 THEN Col% = 1 
  2476. LOCATE row%, Col% 
  2477. FOR x% = 0 TO markit%           'Read the phone number off the screen 
  2478.      a% = SCREEN(row%, Col% + x%) 
  2479.      Dialstr$ = Dialstr$ + CHR$(a%) 
  2480. NEXT x% 
  2481. Here1: 
  2482. Dialstr$ = "544-1573" 
  2483. LOCATE 23, 25 
  2484. PRINT "        Dialing : "; Dialstr$; "        "; 
  2485. LOCATE 25, 1
  2486.  
  2487. PRINT "         Pickup handset and then press space or ESC when phone rings_ 
  2488.                             "; 'line is wrapped 
  2489. COLOR 7, 0 
  2490.  
  2491. Setup port% 
  2492. PRINT #1, "ATM1DP" + Dialstr$     'Dial the number 
  2493. LOCATE 24, 1 
  2494. DO 
  2495.      b$ = INKEY$ 
  2496.      IF b$ = " " THEN 
  2497.           Hangup port% 
  2498.           EXIT DO 
  2499.      END IF 
  2500.      IF b$ = CHR$(27) THEN 
  2501.           Hangup port% 
  2502.           EXIT DO 
  2503.      END IF 
  2504. LOOP 
  2505.  
  2506. END SUB 
  2507.  
  2508. SUB Hangup (port%) 
  2509.  
  2510. PRINT SPACE$(25) + "...Disconnecting 1"; 
  2511. SELECT CASE port%                'Drop DTR 
  2512.     CASE 1 
  2513.         OUT &H3FC, (INP(&H3FC) AND 254)   'com1 
  2514.     CASE 2 
  2515.         OUT &H2FC, (INP(&H2FC) AND 254)   'com2 
  2516. '    CASE 3 
  2517. '        OUT &H3FC, (INP(&H3FC) AND 254)   'com3 
  2518. '    CASE 4 
  2519. '        OUT &H2FC, (INP(&H2FC) AND 254)   'com4 
  2520. END SELECT 
  2521.      PRINT "...2..."; 
  2522.      PRINT #1, "+++";   'Switch to modem command mode if needed 
  2523.      SLEEP 1 
  2524.      PRINT #1, "ATH"    'Send hangup command 
  2525.      PRINT "...CLICK" + SPACE$(22); 
  2526.  
  2527. END SUB 
  2528.  
  2529. SUB Setup (port%) 
  2530. 'Sets up the comport by swapping the address fo com4 with com2 and 
  2531. 'com3 with com1 if necessary 
  2532. 'DEF SEG = 0 
  2533. ' POKE &H400, &HF8 
  2534. ' POKE &H401, 3 
  2535. ' POKE &H402, &HF8 
  2536. ' POKE &H403, 2 
  2537.  
  2538. SELECT CASE port% 
  2539.      CASE 1 
  2540.         Start$ = "COM1:2400,N,8,1,DS0" 
  2541.      CASE 2 
  2542.         Start$ = "COM2:2400,N,8,1,DS0" 
  2543.      CASE 3 
  2544.         POKE &H400, &HE8   'For com1 to com3 
  2545.         Start$ = "COM1:2400,N,8,1,DS0" 
  2546.      CASE 4 
  2547.         POKE &H402, &HE8   'For com2 to com4 
  2548.         Start$ = "COM2:2400,N,8,1,DS0" 
  2549. END SELECT 
  2550. 'DEF SEG 
  2551.  
  2552. OPEN Start$ FOR RANDOM AS 1 
  2553.  
  2554. END SUB 
  2555.  
  2556. ___-------------------------------------------------------------------- 
  2557. ... OFFLINE 1.40 
  2558.  
  2559. --- Maximus 2.01wb
  2560.  * Origin: The BULLpen BBS * Intel 14.4EX (613)549-5168 (1:249/140)
  2561.  
  2562.  
  2563. ------------------------------------------------------------------------
  2564.   The QuickBASIC Scrapbook                                  
  2565.                                                             
  2566.   Vol 1, Issue 1                                            January 1993
  2567. ------------------------------------------------------------------------
  2568. ════════════════════════════════════════════════════════════════════════════════
  2569.  Area:    QuickBasic
  2570.   Msg:    #14193
  2571.  Date:    12-01-92 05:15 (Public) 
  2572.  From:    JERRY ALDRICH            
  2573.  To:      ALL                      
  2574.  Subject: Directory Tree
  2575. ────────────────────────────────────────────────────────────────────────────────
  2576. Howdy,
  2577.  
  2578. Yesterday, I found myself in need of a routine to read and display the
  2579. directory tree in QB (actually PDS 7.1).  I scanned the echo and found
  2580. there was a discussion going on about how to do just that.  Seemed to
  2581. be 2 answers, get a LIB, and use SHELL "DIR > DIR.TXT".  Since I didn't
  2582. want to go searching for a lib, I tried the latter.  Basically, I modified
  2583. the WHEREIS program to look for directories instead of files.  It worked,
  2584. but it was also SLOWWWW!  On a 386sx/16 with a 15ms IDE drive and 176
  2585. directories, it took 97 seconds (compiled) to do the scan.  I KNEW there
  2586. had the be a better way!  I put some thought into it, and the following
  2587. code developed.  It will NOT work on a Mono system, due to the fact it
  2588. uses 2 video pages, but it works just fine with color.  The resulting
  2589. program will scan the same drive in 16.7 Seconds (compiled) or 19.5 
  2590. seconds in the environment.  And it's ALL QB code!  Here 'tis:
  2591.  
  2592. ------------------------------ CUT HERE -----------------------------------
  2593. DECLARE SUB GetDirs (Path$, Level%)
  2594. DECLARE SUB ShowTree ()
  2595. DEFINT A-Z
  2596. ' Dimension Array to Hold Directories and Variable for Number of Dirs
  2597. DIM SHARED Path$(300), DCnt
  2598.  
  2599. ' Set Active and Visual Pages to 1 and Clear Screen
  2600. SCREEN 0, , 1, 1: CLS
  2601.  
  2602. ' Prompt User for Drive Letter and Prepare Screen
  2603. PRINT "Get Tree For Which Drive :";
  2604. DO: Drive$ = UCASE$(INKEY$): LOOP UNTIL LEN(Drive$): PRINT Drive$
  2605. PRINT "Scanning Drive " + Drive$ + " :"
  2606.  
  2607. ' Set Frist Path to Root and Directory Count to 1
  2608. Path$(1) = Drive$ + ":": DCnt = 1
  2609.  
  2610. ' Send Output to Page 0 (hide it)
  2611. SCREEN 0, , 0, 1
  2612.  
  2613. ' Start Recursive Directory Scan
  2614. GetDirs Path$(1), 1
  2615.  
  2616. ' Clear Screen and Set OutPut Back to Page 1 and Show Tree
  2617. CLS : SCREEN 0, , 1, 1
  2618. ShowTree
  2619.  
  2620. ' Set All Pages to 0 and End
  2621. SCREEN 0, , 0, 0
  2622. END
  2623.  
  2624. SUB GetDirs (Path$, Level)
  2625. ' Clear Screen, Display Sub Directories in Path$, Find out Last Line
  2626. CLS : FILES RTRIM$(Path$) + "\*.": LastLin = CSRLIN - 3
  2627.  
  2628. ' Start Scanning Each Line of the Screen for Directory Entries
  2629. FOR Lin = 1 TO LastLin
  2630.   FOR Col = 0 TO 3   ' Start with Column Offset of 0
  2631.     D$ = ""          ' Clear Temp Character Variable
  2632.     DEF SEG = &HB800 ' Set Default Segment to Video Memory
  2633.     ' Read One Entry (17 Characters) From Video Memory
  2634.     FOR Char = 0 TO 34 STEP 2
  2635.       D$ = D$ + CHR$(PEEK(Lin * 160 + Col * 36 + Char))
  2636.     NEXT
  2637.     DEF SEG ' Set Default Segement Back to QB Data
  2638.     ' If Entry is a Sub Directory
  2639.     IF INSTR(D$, "<DIR>") AND INSTR(D$, ".") = 0 THEN
  2640.       ' Update Count on Visible Page
  2641.       DCnt = DCnt + 1: SCREEN 0, , 1, 1: LOCATE 2, 19
  2642.       PRINT LTRIM$(STR$(DCnt)): SCREEN 0, , 0, 1
  2643.       ' Add the Parent Path to the Name
  2644.       P$ = RTRIM$(Path$) + "\" + RTRIM$(LEFT$(D$, INSTR(D$, " ")))
  2645.       ' Store it to the Array
  2646.       Path$(DCnt) = P$
  2647.       ' Do a Recursive Search of That Sub for Subs
  2648.       GetDirs P$, Level + 1
  2649.       ' Find Last \ in Directory Name
  2650.       DO
  2651.         W = INSTR(W + 1, P$, "\"): IF W THEN P = W
  2652.       LOOP WHILE W
  2653.       ' Parse Out the Parent Directory
  2654.       P$ = LEFT$(P$, P - 1)
  2655.       ' Clear Screen, Re-Display Parent Directory, and Get Last Line
  2656.       CLS : FILES P$ + "\*.": LastLin = CSRLIN - 3
  2657.     END IF
  2658.   NEXT
  2659. NEXT
  2660. END SUB
  2661.  
  2662. SUB ShowTree
  2663. CLS : S = 1: Top = 1: IF DCnt < 22 THEN Max = DCnt - 1 ELSE Max = 22
  2664. Refresh:
  2665. OldN = 0: N = 0
  2666. FOR I = Top TO Top + Max
  2667.   P$ = Path$(I): N = 0: P = 0
  2668.   DO
  2669.     W = INSTR(W + 1, P$, "\"): IF W THEN P = W: N = N + 1
  2670.   LOOP WHILE W
  2671.   P2$ = Path$(I + 1): N2 = 0: P2 = 0
  2672.   DO
  2673.     W = INSTR(W + 1, P2$, "\"): IF W THEN P2 = W: N2 = N2 + 1
  2674.   LOOP WHILE W
  2675.   Nof$ = LEFT$(RIGHT$(P$, LEN(P$) - P) + SPACE$(20), 20)
  2676.   IF INSTR(Nof$, ":") THEN
  2677.     LOCATE I, S: PRINT LEFT$("\" + SPACE$(20), 20)
  2678.   ELSE
  2679.     T$ = "": FOR J = 1 TO N - 1: T$ = "│  " + T$: NEXT
  2680.     IF N2 < N THEN T$ = T$ + "└" ELSE T$ = T$ + "├"
  2681.     LOCATE I - Top + 1, S: PRINT T$ + "──";
  2682.     PRINT Nof$
  2683.   END IF
  2684. NEXT
  2685. DO: K$ = INKEY$: LOOP UNTIL LEN(K$)
  2686. IF LEN(K$) = 1 THEN K = ASC(K$) ELSE K = -ASC(RIGHT$(K$, 1))
  2687. SELECT CASE K
  2688.   CASE 27
  2689.     CLS : EXIT SUB
  2690.   CASE -80
  2691.     Top = Top + 1
  2692.   CASE -72
  2693.     Top = Top - 1
  2694.   CASE -73
  2695.     Top = Top - 19
  2696.   CASE -81
  2697.     Top = Top + 19
  2698. END SELECT
  2699. IF Top < 1 THEN Top = 1
  2700. IF Top + Max > DCnt THEN Top = DCnt - Max
  2701. GOTO Refresh
  2702.  
  2703. END SUB
  2704. ------------------------------- CUT HERE --------------------------------
  2705.  
  2706. This Sub is to display the directory tree created by the previous sub.
  2707. It ain't much, but it works.
  2708.  
  2709. Any suggestions or comments about improving the speed would be greatly
  2710. appreciated!
  2711.  
  2712. Have fun with it!
  2713. Jerry Aldrich
  2714.  
  2715. --- Renegade v8-27 Beta
  2716.  * Origin: The Bumpkinland BBS - "Home of BLand Software" (1:296/3)
  2717.  
  2718.  
  2719. ------------------------------------------------------------------------
  2720.   The QuickBASIC Scrapbook                                  
  2721.                                                             
  2722.   Vol 1, Issue 1                                            January 1993
  2723. ------------------------------------------------------------------------
  2724. ════════════════════════════════════════════════════════════════════════════════
  2725.  Area:    QuickBasic
  2726.   Msg:    #20350
  2727.  Date:    12-06-92 22:23 (Public) 
  2728.  From:    MARK REJHON              
  2729.  To:      SHANE HEADER             
  2730.  Subject: Alphabetizer FUNCTION    
  2731. ────────────────────────────────────────────────────────────────────────────────
  2732.  >         Does anyone have a FUNCTION that that will
  2733.  > alphabatize a complete
  2734.  > string array? I have tried unsucessfuly. I'm sure I could do
  2735.  > it, but I thought I would check with you guys to see if you had one
  2736.  > lying around.
  2737.  
  2738. The simplest sorting algorithm, for a 100 string array, non-case sensitive,
  2739. is listed below.  I assume that speed isn't important here.  <G>
  2740.  
  2741. DO
  2742.   Swapped% = 0
  2743.   FOR StringNum% = 1 TO 99
  2744.     IF UCASE$(Array$(StringNum%)) > UCASE$(Array$(StringNum% + 1)) THEN
  2745.       SWAP Array$(StringNum%), Array$(StringNum% + 1)
  2746.       Swapped% = -1
  2747.     ENDIF
  2748.   NEXT StringNum%
  2749. LOOP WHILE Swapped%
  2750.  
  2751.  
  2752. Mark Rejhon
  2753.  
  2754. --- FMail 0.92
  2755.  * Origin: +++ VIddIBBS +++ (613) 521-4486! (1:163/255)
  2756.  
  2757.  
  2758. ------------------------------------------------------------------------
  2759.   The QuickBASIC Scrapbook                                  
  2760.                                                             
  2761.   Vol 1, Issue 1                                            January 1993
  2762. ------------------------------------------------------------------------
  2763. ════════════════════════════════════════════════════════════════════════════════
  2764.  Area:    QuickBasic
  2765.   Msg:    #20558
  2766.  Date:    12-03-92 23:13 (Public) 
  2767.  From:    ERIC B. FORD             
  2768.  To:      MICHEL BERTLER           
  2769.  Subject: Prime numbers gen.       
  2770. ────────────────────────────────────────────────────────────────────────────────
  2771.  > Your program is quite fast! However, could you make it
  2772.  > ask for a user
  2773.  > input (upper limit) and redirect its output into a
  2774.  > readable Ascii file rather than on the screen?
  2775.  
  2776. Well, here's a version to have an upper limit.  (For above 32767 change to 
  2777. LONGs)  To redirect it to an ASCII file you can just compile and then do 
  2778. something like:
  2779.  
  2780. PRIME >Primes.txt
  2781.  
  2782. ' Load QB with the "/l" option
  2783. DIM prime(32767) AS INTEGER: CLS
  2784. PRINT "                        Prime Number Generater"
  2785. PRINT "                             Eric Ford"
  2786. PRINT
  2787. PRINT "What number would you like to end checking at?"
  2788. INPUT Last%
  2789. PRINT : PRINT
  2790.  
  2791. INPUT "Filename (Leave blank for screen)"; File$
  2792.  
  2793. PRINT "The numbers below are prime.        Now testing..."
  2794.  
  2795. tim1 = TIMER: half% = Last% / 2 + 1
  2796.  
  2797.     FOR i% = 3 TO half% STEP 2
  2798.         j% = 2
  2799.         WHILE j% * i% <= Last%
  2800.             prime(j% * i%) = 1
  2801.             j% = j% + 1
  2802.             WEND
  2803.     NEXT i%
  2804.  
  2805.     FOR j% = 4 TO Last% STEP 2
  2806.         prime(j%) = 1
  2807.     NEXT j%
  2808.  
  2809. FOR First% = 1 TO 3
  2810.     prime(First%) = 0
  2811. NEXT First%
  2812.  
  2813. tim2 = TIMER
  2814.  
  2815.  
  2816. IF len(ltrim$(rtrim$(File$))) = 0 then
  2817.     FOR i% = 2 TO Last%
  2818.         IF prime(i%) = 0 THEN primes = primes + 1: PRINT i%
  2819.     NEXT i%
  2820. else
  2821.     open file$ for output as #1
  2822.     for i% = 2 to Last%
  2823.         if prime(i%) = 0 then
  2824.             primes = primes + 1
  2825.             print #1, i%
  2826.         end if
  2827.     next i%
  2828.     close
  2829. end if
  2830.  
  2831. tim = tim2 - tim1
  2832. PRINT "     ---   Done   ---      "; primes;
  2833. PRINT " primes computed in"; tim; "seconds"
  2834.  
  2835.  
  2836. A good deal of this is from the message editor and not QB, so beware of minor 
  2837. mistooks.
  2838.  
  2839. ---
  2840.  * Origin: Eric Ford (1:3632/1.6)
  2841.  
  2842.  
  2843. ------------------------------------------------------------------------
  2844.   The QuickBASIC Scrapbook                                  
  2845.                                                             
  2846.   Vol 1, Issue 1                                            January 1993
  2847. ------------------------------------------------------------------------
  2848. ════════════════════════════════════════════════════════════════════════════════
  2849.  Area:    QuickBasic
  2850.   Msg:    #20619
  2851.  Date:    12-06-92 20:51 (Public) 
  2852.  From:    BRENT ASHLEY             
  2853.  To:      JOHN GALLAS              
  2854.  Subject: QB SIMULATNEOUS INPUT    
  2855. ────────────────────────────────────────────────────────────────────────────────
  2856. Here it is again - without any embellishment.  - Brent -
  2857.  
  2858. 'BASIC test code:
  2859. DECLARE FUNCTION KeyPressed%(ScanCode%)
  2860. CALL InstKeyPress ' install resident code
  2861. CLS
  2862. DO
  2863.   LOCATE 1,1
  2864.   FOR i% = 2 TO 9 ' scancode of 1 to 8
  2865.     IF KeyPressed(i%) THEN PRINT CHR$(47+i%); ELSE PRINT " ";
  2866.   NEXT
  2867.   PRINT
  2868. LOOP UNTIL INKEY$=CHR$(27) ' escape to quit
  2869. CALL UnHookKeyPress ' unhook resident code - IMPORTANT!!!
  2870. END
  2871.  
  2872. ; KeyPress.ASM by Brent Ashley
  2873. ;   checks the "pressed" status of any key
  2874. .model medium, basic
  2875. .code
  2876. Old09        Label Dword       ;Label for to old Int 09h handler
  2877. Old09Offset  dw ?              ;Offset part
  2878. Old09Segment dw ?              ;Segment part
  2879. Hooked       db 0              ;Our installed flag
  2880. KeyMap       db 80 dup(0)      ;map of kybd, one byte per scancode
  2881. InstKeyPress proc uses ds ax dx ; From BASIC: CALL InstKeyPress
  2882.                                ; REMEMBER to call UnhookKeyPress!
  2883.         cmp cs:Hooked,0        ;Are we already hooked?
  2884.         jnz InstallExit        ;If so, exit
  2885.         mov ax,3509h           ;Get current vector for int 09h
  2886.         int 21h
  2887.         mov cs:Old09Segment,es ;Remember it for later
  2888.         mov cs:Old09Offset,bx
  2889.         mov ax,2509h
  2890.         push ds
  2891.         push cs
  2892.         pop ds                 ;Point int 09h handler to our code
  2893.         mov dx, offset OurInt09
  2894.         int 21h
  2895.         pop ds
  2896.         mov cs:Hooked,-1       ;Set our installed flag
  2897. InstallExit:
  2898.         ret
  2899. OurInt09:                      ;Our Int 09h handler
  2900.         push ax
  2901.         push bx
  2902.         push dx
  2903.         push si
  2904.         in al, 60h
  2905.         test al, 080h          ;is "released" bit set?
  2906.         jnz Released           ;yup - go to it
  2907.         mov dl, 0FFh           ;nope - set key pressed flag
  2908.         jmp PutFlag
  2909. Released:
  2910.         and al, 07Fh           ;yes - clear bit for index
  2911.         mov dl, 0              ;and set flag for release
  2912. PutFlag:
  2913.         xor ah, ah
  2914.         mov si, ax             ;assign index
  2915.         mov cs:KeyMap[si], dl  ;put flag in place
  2916.         pop si
  2917.         pop dx
  2918.         pop bx
  2919.         pop ax
  2920. Continue:
  2921.         jmp dword ptr cs:[Old09];Transfer ctrl to orig Int 09h
  2922. InstKeyPress endp
  2923. KeyPressed proc uses bx si, ScanCode:WORD
  2924.         ; from BASIC: TrueOrFalse% = KeyPressed(ScanCode%)
  2925.         mov bx, ScanCode       ;get scan code addr
  2926.         mov si, [bx]           ;load value as index
  2927.         mov al, cs:KeyMap[si]  ;put flag in al
  2928.         cbw                    ;convert to word for integer value
  2929.         ret
  2930. KeyPressed endp
  2931. UnhookKeyPress proc            ; from BASIC: CALL UnHookKeyPress
  2932.         cmp cs:Hooked,0        ; are we installed?
  2933.         jz UnHooked            ; nope - exit
  2934.         push ax
  2935.         push ds
  2936.         mov ax,2509h           ;Unhook ourself
  2937.         mov ds,Old09Segment
  2938.         mov dx,Old09Offset
  2939.         int 21h                ;Point Int 09h back to orig hndlr
  2940.         pop ds
  2941.         pop ax
  2942.         mov cs:Hooked,0        ;Set installed flag back to zero
  2943. UnHooked:
  2944.         ret
  2945. UnhookKeyPress endp
  2946. END
  2947. --- FidoPCB v1.3 [ff053/x]
  2948.  * Origin: Canada Remote Systems, Mississauga, Ontario  (1:229/15)
  2949.  
  2950.  
  2951. ------------------------------------------------------------------------
  2952.   The QuickBASIC Scrapbook                                  
  2953.                                                             
  2954.   Vol 1, Issue 1                                            January 1993
  2955. ------------------------------------------------------------------------
  2956. ════════════════════════════════════════════════════════════════════════════════
  2957.  Area:    QuickBasic
  2958.   Msg:    #20725
  2959.  Date:    12-07-92 21:06 (Public) 
  2960.  From:    EARL MONTGOMERY          
  2961.  To:      ALL                      
  2962.  Subject: Animation (Page Flipping)
  2963. ────────────────────────────────────────────────────────────────────────────────
  2964. I had asked in previous posts how I could avoid the PCOPY 7,0.
  2965. Well I finally figure it out. I had forgotten about the SWAP
  2966. command. For those that are interested here is the code again:
  2967. DEFINT A-Z: SCREEN 7: CLS : x = 60: pg = -1: v = 118: h = 30: up = 23
  2968. write2page% = 1: viewpage% = 0
  2969. Q$ = "E2U2R1U4H2R3U1D1R2U1D1R3G2D4R1D2F2L10"
  2970. n$ = "E2U1E2U2G2L1H1U1E4R3F2D4G1D2F2L10"
  2971. start:
  2972. FOR c = 0 TO 7
  2973. x = x + 1: h = h + 1: pg = pg + 1: up = up - 1
  2974. IF up < 5 THEN up = 23
  2975. SCREEN , , write2page%, viewpage%
  2976. CLS
  2977. LOCATE 2, 2: COLOR 3: PRINT "Demo Of Animation Using Page Flipping"
  2978. LOCATE up, 10: COLOR 1: PRINT "Chess Pieces In The Sky"
  2979. DRAW "BM=" + VARPTR$(x) + ",=" + VARPTR$(v)
  2980. DRAW "s8;C8;X" + VARPTR$(Q$): PAINT (x + 4, v - 2), 4, 8
  2981. DRAW "BM=" + VARPTR$(h) + ",=" + VARPTR$(v)
  2982. DRAW "C8;X" + VARPTR$(n$): PAINT (h + 4, v - 2), 15, 8
  2983. FOR z = 0 TO 50
  2984. PSET (RND * 320, RND * 200), RND * 15
  2985. SWAP write2page%, viewpage%
  2986. IF x > 300 THEN GOTO holdscrn
  2987. NEXT: NEXT
  2988. GOTO start
  2989. holdscrn:
  2990. GOTO holdscrn
  2991. ' E N D
  2992. Earl
  2993.  
  2994. --- Maximus 2.01wb
  2995.  * Origin: Rabbit and Snake's BBS - Richardson, Texas (1:124/6108)
  2996.  
  2997.  
  2998. ------------------------------------------------------------------------
  2999.   The QuickBASIC Scrapbook                                  
  3000.                                                             
  3001.   Vol 1, Issue 1                                            January 1993
  3002. ------------------------------------------------------------------------
  3003. ════════════════════════════════════════════════════════════════════════════════
  3004.  Area:    QuickBasic
  3005.   Msg:    #21116
  3006.  Date:    12-07-92 07:49 (Public) 
  3007.  From:    ZACK JONES               
  3008.  To:      TOM CARROLL              
  3009.  Subject: FIDO MESSAGES            
  3010. ────────────────────────────────────────────────────────────────────────────────
  3011. Hello Tom!
  3012.  
  3013. 04 Dec 92, Tom Carroll writes to All:
  3014.  
  3015.  TC> Does anyone know how to get the Destination Zone and Origin Zone numbers
  3016.  TC> from a fido style .MSG?
  3017.  
  3018. Here's something I picked up some time ago - hopefully this will help. 
  3019. Credit, of course, goes to Marshall Emm.
  3020.  
  3021.  
  3022. 'By: Marshall Emm
  3023. REM Define the header of a Fido message
  3024. TYPE msghdr
  3025.  FromUserName AS STRING * 36
  3026.    ToUserName AS STRING * 36
  3027.       Subject AS STRING * 72
  3028.      DateTime AS STRING * 20
  3029.     TimesRead AS INTEGER
  3030.      DestNode AS INTEGER
  3031.      OrigNode AS INTEGER
  3032.          Cost AS INTEGER
  3033.       OrigNet AS INTEGER
  3034.       DestNet AS INTEGER
  3035.          Fill AS STRING * 8
  3036.       ReplyTo AS INTEGER
  3037.     Attribute AS INTEGER
  3038.     NextReply AS INTEGER
  3039. END TYPE
  3040.  
  3041. DIM Header AS msghdr
  3042. f$ = "d:2.msg"
  3043.  
  3044. OPEN f$ FOR BINARY AS 1
  3045.   GET 1, 1, Header
  3046.   size = LOF(1) - LEN(Header) + 1:  Message$ = STRING$(size, 0)
  3047.   GET 1, LEN(Header) + 1, Message$ 'text of message, i.e.
  3048.   '                                everything after the header
  3049. CLOSE
  3050.  
  3051. PRINT "Message file: "; f$
  3052. PRINT
  3053. PRINT "FromUserName: "; Header.FromUserName
  3054. PRINT "  ToUserName: "; Header.ToUserName
  3055. PRINT "     Subject: "; Header.Subject
  3056. PRINT
  3057. PRINT "     OrigNet: "; Header.OrigNet
  3058. PRINT "    OrigNode: "; Header.OrigNode
  3059. PRINT "     DestNet: "; Header.DestNet
  3060. PRINT "    DestNode: "; Header.DestNode
  3061. PRINT
  3062. PRINT "    DateTime: "; Header.DateTime
  3063. PRINT "   TimesRead: "; Header.TimesRead
  3064. PRINT "        Cost: "; Header.Cost
  3065. PRINT
  3066. PRINT "     ReplyTo: "; Header.ReplyTo
  3067. PRINT "   Attribute: "; Header.Attribute
  3068. PRINT "   NextReply: "; Header.NextReply
  3069. PRINT
  3070. PRINT Message$
  3071. 'now the fun starts if you want to format the text of Message$, which
  3072. 'is a single "line."
  3073.  
  3074. Zack
  3075.  
  3076. --- GoldED 2.40
  3077.  * Origin: Zack's Shack San Antonio, TX  (210) 653-2115 (1:387/641)
  3078.  
  3079.  
  3080. ------------------------------------------------------------------------
  3081.   The QuickBASIC Scrapbook                                  
  3082.                                                             
  3083.   Vol 1, Issue 1                                            January 1993
  3084. ------------------------------------------------------------------------
  3085. ════════════════════════════════════════════════════════════════════════════════
  3086.  Area:    QuickBasic
  3087.   Msg:    #21943
  3088.  Date:    12-07-92 22:52 (Public) 
  3089.  From:    JOE NEGRON               
  3090.  To:      SHANE HEADER             
  3091.  Subject: Alphabetizer FUNCTION    
  3092. ────────────────────────────────────────────────────────────────────────────────
  3093. SH> Does anyone have a FUNCTION that that will alphabatize a complete
  3094.   > string array? I have tried unsucessfuly. I'm sure I could do it, but I
  3095.   > thought I would check with you guys to see if you had one lying around.
  3096.  
  3097. What you need is a sort routine.  There are a number of different
  3098. sorting methods; here is a relatively simple one, based on the Bubble
  3099. Sort, called a "Comb" sort:
  3100.  
  3101. ============================== Begin code ==============================
  3102. DEFINT A-Z
  3103.  
  3104. DECLARE SUB CombSort (Array$())
  3105.  
  3106. '***********************************************************************
  3107. '* SUB CombSort
  3108. '*
  3109. '* PURPOSE
  3110. '*    Sorts an array using the Comb sort algorithm.
  3111. '*
  3112. '* CREDIT(S)
  3113. '*    This routine was taken from the article "A Fast, Easy Sort", by
  3114. '*    Stephen Lacey and Richard Box, from the "Hands On" column of the
  3115. '*    April 1991 issue of Byte.
  3116. '***********************************************************************
  3117. SUB CombSort (Array$()) STATIC
  3118.    FirstEl% = LBOUND(Array$)
  3119.    LastEl% = UBOUND(Array$)
  3120.    Gap% = LastEl%
  3121.  
  3122.    DO
  3123.       IF Gap% * 8 / 11 > 1 THEN
  3124.          Gap% = Gap% * 8 / 11
  3125.       ELSE
  3126.          Gap% = 1
  3127.       END IF
  3128.  
  3129.       Switch% = 0
  3130.  
  3131.       FOR I% = FirstEl% TO LastEl% - Gap%
  3132.          J% = I% + Gap%
  3133.          IF Array$(I%) > Array$(J%) THEN
  3134.             SWAP Array$(I%), Array$(J%)
  3135.             Switch% = Switch% + 1
  3136.          END IF
  3137.       NEXT I%
  3138.    LOOP UNTIL Switch% = 0 AND Gap% = 1
  3139. END SUB
  3140. =============================== End code ===============================
  3141.  
  3142. Simply pass your array to this SUB as follows:
  3143.  
  3144.    CombSort Array$()
  3145.  
  3146. or
  3147.  
  3148.    CALL CombSort(Array$())
  3149.  
  3150. As I said, there are a number of different sorting algorithms.  I use
  3151. this one the majority of the time since it is small, simple, and fairly
  3152. fast.
  3153.  
  3154. Just for comparison's sake, here is a Shell sort:
  3155.  
  3156. ============================== Begin code ==============================
  3157. DEFINT A-Z
  3158.  
  3159. DECLARE SUB ShellSort (Array$())
  3160.  
  3161. '***********************************************************************
  3162. '* SUB ShellSort
  3163. '*
  3164. '* PURPOSE
  3165. '*    Sorts an array using the shell sort algorithm.
  3166. '***********************************************************************
  3167. SUB ShellSort (Array$()) STATIC
  3168.    FirstEl% = LBOUND(Array$)
  3169.    LastEl% = UBOUND(Array$)
  3170.    Span% = LastEl% \ 2
  3171.  
  3172.    DO WHILE Span% > 0
  3173.       Boundary% = LastEl% - Span%
  3174.  
  3175.       DO
  3176.          Flag% = 0
  3177.  
  3178.          FOR I% = FirstEl% TO Boundary%
  3179.             IF Array$(I%) > Array$(I% + Span%) THEN
  3180.                SWAP Array$(I%), Array$(I% + Span%)
  3181.                Flag% = I%
  3182.             END IF
  3183.          NEXT I%
  3184.  
  3185.          Boundary% = Flag% - Span%
  3186.       LOOP WHILE Flag%
  3187.  
  3188.       Span% = Span% \ 2
  3189.    LOOP
  3190. END SUB
  3191. =============================== End code ===============================
  3192.  
  3193. Both of these routines are fairly fast, and require a minimal amout of
  3194. memory.
  3195.  
  3196. BTW, these routines are implemented as SUBs rather than FUNCTIONs,
  3197. because they do not need to return a value to the caller.
  3198.  
  3199.                                 --Joe in Bay Ridge, Brooklyn, NY--
  3200.                                       Mon  12-07-1992, 22:38
  3201.  
  3202.  * SLMR 2.1a * Windows: Brought to you by the makers of Edlin!
  3203.  
  3204. --- Maximus 2.01wb
  3205.  * Origin: * BlueDog BBS * (212) 594-4425 * NYC FileBone Hub (1:278/709)
  3206.  
  3207.  
  3208. ------------------------------------------------------------------------
  3209.   The QuickBASIC Scrapbook                                  
  3210.                                                             
  3211.   Vol 1, Issue 1                                            January 1993
  3212. ------------------------------------------------------------------------
  3213. ════════════════════════════════════════════════════════════════════════════════
  3214.  Area:    QuickBasic
  3215.   Msg:    #22064
  3216.  Date:    12-07-92 23:29 (Public) 
  3217.  From:    ERIC B. FORD             
  3218.  To:      JEFFERY FOY              
  3219.  Subject: *.MSG                    
  3220. ────────────────────────────────────────────────────────────────────────────────
  3221. Ah, looking at this I wonder:
  3222.  
  3223. '
  3224. ' *** MAILFIND V1.00 Copyright 1992 Eric Ford ***
  3225. '
  3226. 'ON ERROR GOTO errmsg:
  3227.  
  3228.  ' Open the file
  3229.  
  3230.  TYPE headertype
  3231.       fromname  AS STRING * 36
  3232.       toname    AS STRING * 36
  3233.       subject   AS STRING * 72
  3234.       datetime  AS STRING * 20
  3235.       timesread AS INTEGER
  3236.       destnode  AS INTEGER
  3237.       orignode  AS INTEGER
  3238.       cost      AS INTEGER
  3239.       orignet   AS INTEGER
  3240.       destnet   AS INTEGER
  3241.       fill      AS STRING * 8           '  WHAT???
  3242.       replyto   AS INTEGER
  3243.       attribute AS INTEGER
  3244.       nextreply AS INTEGER
  3245.  END TYPE
  3246.  
  3247. What's in there?  Anything important?  Does Front Door need that dumb stuff 
  3248. or is it 'reserved'?  I am thinking of adding a automatic routing system to 
  3249. VIPMAIL (BTW- Any suggestions?)  and need some place to put it, and would 
  3250. prefer not to have to invade the message body.  Can I stuff it there?  Any 
  3251. other ideas?
  3252.  
  3253. ---
  3254.  * Origin: Eric Ford (1:3632/1.6)
  3255.  
  3256.  
  3257. ------------------------------------------------------------------------
  3258.   The QuickBASIC Scrapbook                                  
  3259.                                                             
  3260.   Vol 1, Issue 1                                            January 1993
  3261. ------------------------------------------------------------------------
  3262. ════════════════════════════════════════════════════════════════════════════════
  3263.  Area:    QuickBasic
  3264.   Msg:    #22629
  3265.  Date:    12-08-92 13:13 (Public) 
  3266.  From:    ROB MCKEE                
  3267.  To:      ALL                      
  3268.  Subject: Errorlevel               
  3269. ────────────────────────────────────────────────────────────────────────────────
  3270. Hi All,
  3271.       I found out where MS-Dos V.5 Command.com keeps the  ErrorLevel Info 
  3272. (plus &h2b3 from the beginning of Command.com as Listed by Mem /d)  Does 
  3273. anyone know
  3274.  
  3275. C:\>MEM/D
  3276.  
  3277.   Address     Name          Size       Type 
  3278.   -------     --------     ------     ------
  3279.   000000                   000400     Interrupt Vector
  3280.   000400                   000100     ROM Communication Area
  3281.   000500                   000200     DOS Communication Area
  3282.  
  3283.   000700      IO           000A60     System Data
  3284.                   CON                   System Device Driver 
  3285.   _____________________/\  ____________________________
  3286.                          \/
  3287.                   COM4                  System Device Driver 
  3288.  
  3289.   001160      MSDOS        0013D0     System Data
  3290.  
  3291.   002530      IO           002C70     System Data
  3292.   _____________________/\  ____________________________
  3293.                          \/
  3294.   0051B0      MSDOS        000040     System Program
  3295.  
  3296.   005200      COMMAND      000940     Program   
  3297.   005B50      EZPOINT      000040     Data      
  3298.   005BA0      COMMAND      000400     Environment
  3299.  
  3300.  The byte on my computer as configured is 0054B3.  But what I want to know 
  3301. how to do is access the List of List from within QBas.  I wrote an ASM 
  3302. program thats hardcoded to read the Byte at &h54b3.  I would like to be able 
  3303. to find where COMMAND.COM start's in any computer and then read the 
  3304. ERRORLEVEL.
  3305.  
  3306.  n ErrLvl.com
  3307.  RCX
  3308.  4b
  3309.  a
  3310.    MOV AX,054B                   ; Point to Segment
  3311.    PUSH    DS                    ; Save Data Seg
  3312.    MOV DS,AX                     ; Load new Data Segment
  3313.    MOV AL,[0003]                 ; Get Errorlevel
  3314.    POP DS                        ; Restore Data Segment
  3315.    JMP 0113                      ; Jmp around Data
  3316.    DB 00 00 00 0D 0A 24 00       ; Working Data
  3317.    MOV [0112],AL                 ; Save Errorlevel
  3318.    CMP AL,00                     ; Is it 0 don't need to Divide then
  3319.    JZ  012F                      ; If 0 skip Divide
  3320.    XOR AH,AH                     ; 0 out Remainder
  3321.    MOV BL,0A                     ; Set Divisor
  3322.    DIV BL                        ; Divide
  3323.    MOV [010E],AH                 ; Save the 1's digit
  3324.    XOR AH,AH                     ; 0 out Remainder
  3325.    DIV BL                        ; Divide
  3326.    MOV [010D],AH                 ; Save the 10's digit
  3327.    MOV [010C],AL                 ; Save the 100's digit
  3328.    MOV DX,010C                   ; Set start of string
  3329.    MOV AH,09                     ; Load for Output String Func
  3330.    ADD BYTE PTR [010C],30        ; Add 30h to make it Ascii #
  3331.    ADD BYTE PTR [010D],30        ; Add 30h to make it Ascii #
  3332.    ADD BYTE PTR [010E],30        ; Add 30h to make it Ascii #
  3333.    INT 21                        ; Output the String
  3334.    MOV AL,[0112]                 ; Get the ERRORLEVEL again
  3335.    MOV AH,4C                     ; Setup for Exit with ERRORLEVEL
  3336.    INT 21                        ; ByeBye...
  3337.  
  3338.    w
  3339.    q
  3340.  ------------------------------ 8< ---------------------------
  3341.  AS you can see, it Exit's with the same Errorlevel that it had coming into 
  3342. it.  I have a listing of the Dos 3.x Master List but I don't know if it's the 
  3343. same as Dos 5.  If I can intercept the ErrorLevel inside Qbas then I can 
  3344. replace alot of 'IF ERRORLEVEL statements in my Bat Files and do more things 
  3345. in my Bat files.
  3346.  
  3347.                                TTYL -Rob
  3348.  
  3349. --- EZPoint V2.1
  3350.  * Origin: Flyer Proof Computer Services V# 510-237-8091 (1:125/1212.13)
  3351.   
  3352.                                TTYL -Rob
  3353.  
  3354.  
  3355. ------------------------------------------------------------------------
  3356.   The QuickBASIC Scrapbook                                  
  3357.                                                             
  3358.   Vol 1, Issue 1                                            January 1993
  3359. ------------------------------------------------------------------------
  3360. ════════════════════════════════════════════════════════════════════════════════
  3361.  Area:    QuickBasic
  3362.   Msg:    #23279
  3363.  Date:    12-08-92 07:56 (Public) 
  3364.  From:    DAVID COLSTON            
  3365.  To:      ALL                      
  3366.  Subject: Sorts                    
  3367. ────────────────────────────────────────────────────────────────────────────────
  3368. I have caught several post on sorts. In particular a need to sort a
  3369. directory. Here is a sample program for this in 7.1.
  3370. DECLARE SUB QuickSort (A$(), NumberofRecords!)
  3371. DIM A$(1000)
  3372. Count = 1
  3373. Filespect$ = "*.*"
  3374. A$(Count) = DIR$(Filespect$)
  3375. IF LEN(A$(1)) > 0 THEN
  3376.      DO
  3377.           A$ = DIR$
  3378.           IF LEN(A$) > 0 THEN
  3379.                Count = Count + 1
  3380.                A$(Count) = A$
  3381.           END IF
  3382.      LOOP UNTIL LEN(A$) = 0
  3383. ELSE
  3384.   Count = 0
  3385. END IF
  3386. IF Count > 0 THEN
  3387.     QuickSort A$(), Count
  3388.     OPEN "O", 2, "Files.Dir"
  3389.      FOR I = 1 TO Count
  3390.           PRINT #2, A$(I)
  3391.      NEXT
  3392.      CLOSE
  3393. END IF
  3394.  
  3395. SUB QuickSort (A$(), NumberofRecords) STATIC
  3396. False = 0
  3397.      Offset = NumberofRecords \ 2
  3398.      ' Loop until offset gets to zero:
  3399.      DO WHILE Offset > 0
  3400.           Limit = NumberofRecords - Offset
  3401.           DO
  3402.  
  3403.       ' Assume no switches at this offset:
  3404.       Switch = False
  3405.  
  3406.       ' Compare elements and switch ones out of order:
  3407.       FOR I = 1 TO Limit
  3408.            IF A$(I) > A$(I + Offset) THEN
  3409.                 SWAP A$(I), A$(I + Offset)
  3410.                 Switch = I
  3411.            END IF
  3412.       NEXT I
  3413.  
  3414.       ' Sort on next pass only to where
  3415.       ' last switch was made:
  3416.       Limit = Switch
  3417.           LOOP WHILE Switch
  3418.  
  3419.           ' No switches at last offset, try one half as big:
  3420.           Offset = Offset \ 2
  3421.      LOOP
  3422.  
  3423. END SUB
  3424.  
  3425.  
  3426. 'I hope this helps some of you.
  3427.  
  3428.  * OLX 2.1 TD * Press any key to continue or any other key to quit
  3429.  
  3430.  
  3431. --- WM v2.04/92-0178
  3432.  * Origin: Paradox of Arkansas *Wildcat 3.0* 501-646-7158 (1:19/121)
  3433.  
  3434.  
  3435. ------------------------------------------------------------------------
  3436.   The QuickBASIC Scrapbook                                  
  3437.                                                             
  3438.   Vol 1, Issue 1                                            January 1993
  3439. ------------------------------------------------------------------------
  3440. ════════════════════════════════════════════════════════════════════════════════
  3441.  Area:    QuickBasic
  3442.   Msg:    #24372
  3443.  Date:    12-10-92 02:52 (Public) 
  3444.  From:    JOHN SNEERINGER          
  3445.  To:      SHANE HEADER             
  3446.  Subject: Alphabetizer FUNCTION    
  3447. ────────────────────────────────────────────────────────────────────────────────
  3448. * Originally addressed to All, Shane Header said:
  3449. SH->        Does anyone have a FUNCTION that that will
  3450. SH->alphabatize a complete
  3451. SH->string array? I have tried unsucessfuly. I'm sure I could do
  3452. SH->it, but I
  3453. SH->thought I would check with you guys to see if you had one
  3454. SH->lying around.
  3455.  
  3456. DEFINT A-Z
  3457.  
  3458. ' ==============================================================
  3459. ' The Fastest QuickBasic Sort Routine Alive. 516% faster than
  3460. ' any living bubble array. THIS ONE DOES STRINGS, NOT NUMERICS.
  3461. ' ==============================================================
  3462.  
  3463. DECLARE FUNCTION RandInt% (Lower, Upper)
  3464. DECLARE SUB QuickSort (Low, High)
  3465. DIM SHARED SortArray$(11)
  3466.  
  3467. CLS
  3468.  
  3469. SortArray$(1) = "6"
  3470. SortArray$(2) = "3"
  3471. SortArray$(3) = "5"
  3472. SortArray$(4) = "6"
  3473. SortArray$(5) = "8"
  3474. SortArray$(6) = "9"
  3475. SortArray$(7) = "5"
  3476. SortArray$(8) = "4"
  3477. SortArray$(9) = "3"
  3478. SortArray$(10) = "2"
  3479. SortArray$(11) = "1"
  3480. Low = 1
  3481. High = 11
  3482.  
  3483.  
  3484. CALL QuickSort(Low, High)
  3485.  
  3486. FOR a = Low TO High
  3487. PRINT SortArray$(a)
  3488. NEXT
  3489.  
  3490. SUB QuickSort (Low, High)
  3491.  
  3492.    IF Low < High THEN
  3493.  
  3494.       IF High - Low = 1 THEN
  3495.          IF SortArray$(Low) > SortArray$(High) THEN
  3496.             SWAP SortArray$(Low), SortArray$(High)
  3497.          END IF
  3498.       ELSE
  3499.  
  3500.          RandIndex = RandInt%(Low, High)
  3501.          SWAP SortArray$(High), SortArray$(RandIndex)
  3502.          Partition$ = SortArray$(High)
  3503.          DO
  3504.  
  3505.             I = Low: J = High
  3506.             DO WHILE (I < J) AND (SortArray$(I) <= Partition$)
  3507.                I = I + 1
  3508. --- D'Bridge 1.30/071082
  3509.  * Origin: RadioLink! Columbus, OH (614)766-2162 HST/DS (1:226/140)
  3510.  
  3511.  
  3512. ------------------------------------------------------------------------
  3513.   The QuickBASIC Scrapbook                                  
  3514.                                                             
  3515.   Vol 1, Issue 1                                            January 1993
  3516. ------------------------------------------------------------------------
  3517. ════════════════════════════════════════════════════════════════════════════════
  3518.  Area:    QuickBasic
  3519.   Msg:    #24373
  3520.  Date:    12-10-92 02:54 (Public) 
  3521.  From:    JOHN SNEERINGER          
  3522.  To:      ALL                      
  3523.  Subject: Rest of Q-Sort           
  3524. ────────────────────────────────────────────────────────────────────────────────
  3525.             LOOP
  3526.             DO WHILE (J > I) AND (SortArray$(J) >= Partition$)
  3527.                J = J - 1
  3528.             LOOP
  3529.  
  3530.             IF I < J THEN
  3531.                SWAP SortArray$(I), SortArray$(J)
  3532.             END IF
  3533.          LOOP WHILE I < J
  3534.  
  3535.          SWAP SortArray$(I), SortArray$(High)
  3536.  
  3537.          IF (I - Low) < (High - I) THEN
  3538.             QuickSort Low, I - 1
  3539.             QuickSort I + 1, High
  3540.          ELSE
  3541.             QuickSort I + 1, High
  3542.             QuickSort Low, I - 1
  3543.          END IF
  3544.       END IF
  3545.    END IF
  3546. END SUB
  3547.  
  3548. FUNCTION RandInt% (Lower, Upper) STATIC
  3549.  
  3550. ' =======================================================================
  3551. '   Returns a random integer greater than or equal to the Lower parameter
  3552. '   and less than or equal to the Upper parameter.
  3553. ' =======================================================================
  3554.  
  3555.    RandInt% = INT(RND * (Upper - Lower + 1)) + Lower
  3556. END FUNCTION
  3557.  
  3558. ---
  3559.  * Origin: RadioLink! Columbus, OH (614)766-2162 QuickBasic! HST/DS 
  3560. (1:226/140)
  3561.  
  3562.  
  3563. ------------------------------------------------------------------------
  3564.   The QuickBASIC Scrapbook                                  
  3565.                                                             
  3566.   Vol 1, Issue 1                                            January 1993
  3567. ------------------------------------------------------------------------
  3568. ════════════════════════════════════════════════════════════════════════════════
  3569.  Area:    QuickBasic
  3570.   Msg:    #3326
  3571.  Date:    12-08-92 15:36 (Public) 
  3572.  From:    VICTOR YIU               
  3573.  To:      MICHEL BERTLER           
  3574.  Subject: Prime numbers gen.       
  3575. ────────────────────────────────────────────────────────────────────────────────
  3576.  -=> Quoting Eric B. Ford to Michel Bertler <=-
  3577.  
  3578. To redirect:
  3579.  EBF> PRIME >Primes.txt
  3580.  
  3581. ________Clip here_______
  3582.  
  3583. ' the slightly modified version of
  3584. ' Eric Ford's prime # generator
  3585.  
  3586. DEFINT A-Z: CLS
  3587.  
  3588. INPUT "Highest #"; Last
  3589. DIM Prime(Last + 1) AS INTEGER
  3590.  
  3591. H = Last \ 2
  3592. T! = TIMER
  3593.  
  3594. FOR I = 3 TO H STEP 2
  3595.     J = 2
  3596.     WHILE J * I <= Last
  3597.         Prime(J * I) = 1
  3598.         J = J + 1
  3599.     WEND
  3600. NEXT I
  3601.  
  3602. FOR J = 4 TO Last STEP 4
  3603.     Prime(J) = 1
  3604. NEXT J
  3605.  
  3606. T! = TIMER - T!
  3607.  
  3608. PRINT "2  3";
  3609.  
  3610. FOR I = 3 TO Last STEP 2
  3611.     IF Prime(I) = 0 THEN PRINT I;
  3612. NEXT I
  3613.  
  3614. PRINT
  3615. PRINT "Computed in"; T!; "seconds"
  3616.  
  3617. _______
  3618. This program is much neater (and slightly faster I think) than the 
  3619. on-the-fly program he made...
  3620.  
  3621. ... Restroom meter:  [......../]  Aaarhgh.  I've got to go!!!
  3622. --- Blue Wave/RA v2.10 [NR]
  3623.  * Origin: Hard Disc Cafe / Houston Texas / (713) 589-2690 / (1:106/30.0)
  3624.  
  3625.  
  3626. ------------------------------------------------------------------------
  3627.   The QuickBASIC Scrapbook                                  
  3628.                                                             
  3629.   Vol 1, Issue 1                                            January 1993
  3630. ------------------------------------------------------------------------
  3631. ════════════════════════════════════════════════════════════════════════════════
  3632.  Area:    QuickBasic
  3633.   Msg:    #3755
  3634.  Date:    12-11-92 06:33 (Public) 
  3635.  From:    STEVE GARTRELL           
  3636.  To:      GEOFFREY LIU             
  3637.  Subject: Rotate GET/PUT arrays    
  3638. ────────────────────────────────────────────────────────────────────────────────
  3639. 'For big arrays, this screams for conversion to assembly.
  3640. 'But, using this, it's just a translation job.
  3641. 'Remember, this is a pixel by pixel rotation, so at
  3642. 'angles other than 0 or 180, lettering is reversed.  (You'd
  3643. 'need to approach it in blocks the size of a standard
  3644. 'character in whichever screen mode you were in, to do
  3645. 'writing.  I wasn't going to do it all!!!)
  3646. DEFINT A-Z
  3647. DECLARE SUB RotateArray (SourceArray%(), TargetArray%(), Angle%)
  3648. 'Must have the appropriate QB.QLB/QBX.QLB/VBDOS.QLB loaded
  3649. ' if in the environment-link with appropriate library....
  3650. DECLARE SUB ABSOLUTE (Var%, BYVAL HowFar%, address AS INTEGER)
  3651. CONST C$ = "Created 12/01/92 by Steve Gartrell"
  3652. CONST NumBytes = 21
  3653. '$STATIC
  3654. DIM SHARED RORproc%(1 TO (NumBytes / 2))
  3655. '$DYNAMIC
  3656. DIM SHARED BitsPP%, Planes%, MaskBits%
  3657. DIM TheScreens%(1 TO 9)
  3658. offset% = VARPTR(RORproc%(1))
  3659. FOR byte% = 0 TO NumBytes - 1
  3660.   READ opcode%
  3661.   POKE (offset% + byte%), opcode%
  3662. NEXT byte%
  3663. TheScreens%(1) = 1
  3664. TheScreens%(2) = 2
  3665. TheScreens%(3) = 7
  3666. TheScreens%(4) = 8
  3667. TheScreens%(5) = 9
  3668. TheScreens%(6) = 11
  3669. TheScreens%(7) = 12
  3670. TheScreens%(8) = 13
  3671. KEY OFF
  3672. ScrCnt% = 8
  3673. DO
  3674.   SCREEN TheScreens%(ScrCnt%)
  3675.   MaskBits% = 128
  3676.   SELECT CASE TheScreens%(ScrCnt%)
  3677.     CASE 1   'Screen 1
  3678.     MaskBits% = 192
  3679.     BitsPP% = 2: Planes% = 1
  3680.     ColorMod% = 3
  3681.     CASE 2   'Screen 2
  3682.     BitsPP% = 1: Planes% = 1
  3683.     ColorMod% = 2
  3684.     CASE 7   'Screen 7
  3685.     BitsPP% = 1: Planes% = 4
  3686.     ColorMod% = 16
  3687.     CASE 8   'Screen 8
  3688.     BitsPP% = 1: Planes% = 4
  3689.     ColorMod% = 16
  3690.     CASE 9  'Screen 9
  3691.     BitsPP% = 1: Planes% = 4
  3692.     ColorMod% = 16
  3693.     CASE 11  'Screen 11
  3694.     BitsPP% = 1: Planes% = 1
  3695.     ColorMod% = 2
  3696.     CASE 12  'Screen 12
  3697.     BitsPP% = 1: Planes% = 4
  3698.     ColorMod% = 16
  3699.     CASE 13  'Screen 13
  3700.     MaskBits% = 255
  3701.     BitsPP% = 8: Planes% = 1
  3702.     ColorMod% = 256
  3703.   END SELECT
  3704.   StartX% = 119: StartY% = 55: EndX% = 199: EndY% = 135
  3705.   ArrayBytes& = 4 + INT(((EndX% - StartX% + 1)_
  3706.  * (BitsPP%) + 7) / 8) * Planes% * ((EndY% - StartY%) + 1)
  3707.   REDIM SourceArray%(0 TO ArrayBytes& \ 2)
  3708.   REDIM BlankArray%(0 TO ArrayBytes& \ 2)
  3709.   REDIM TargetArray%(0 TO 20)
  3710.   GET (StartX%, StartY%)-(EndX%, EndY%), BlankArray%(0)
  3711.   FOR TheLine% = 1 TO 24
  3712.     LOCATE TheLine%, 1
  3713.     FOR cnt% = 33 TO 72
  3714.       SELECT CASE TheScreens%(ScrCnt%)
  3715.         CASE 1, 2, 11
  3716.         CASE ELSE
  3717.           COLOR cnt% MOD ColorMod%
  3718.       END SELECT
  3719.       PRINT CHR$(cnt%);
  3720.     NEXT
  3721.     IF TheLine% <> 24 THEN PRINT
  3722.   NEXT
  3723.   GET (StartX%, StartY%)-(EndX%, EndY%), SourceArray%(0)
  3724.   DO
  3725.     DO: t$ = UCASE$(INKEY$): LOOP UNTIL LEN(t$)
  3726.     SELECT CASE t$
  3727.       CASE "Q"  'QUIT!!!!!
  3728.         SCREEN 0: WIDTH 80: COLOR 7, 0: END
  3729.       CASE "N"  'CHANGE SCREEN MODE!!!
  3730.         ScrCnt% = ScrCnt% + 1
  3731.         IF ScrCnt% = 9 THEN ScrCnt% = 1
  3732.         EXIT DO
  3733.       CASE ELSE  'ROTATE!!!!
  3734.         Angle% = (Angle% + 90) MOD 360
  3735.         RotateArray SourceArray%(), TargetArray%(), Angle%
  3736.         WAIT &H3DA, 8, 8
  3737.         WAIT &H3DA, 8
  3738.         PUT (StartX%, StartY%), BlankArray%(0), PSET
  3739.         PUT (StartX%, StartY%), TargetArray%(0), PSET
  3740.         ERASE TargetArray%
  3741.     END SELECT
  3742.   LOOP
  3743. LOOP
  3744. RotRight:
  3745. DATA &H55              : 'push   bp
  3746. DATA &H8B,&HEC         : 'mov    bp, sp
  3747. DATA &H51              : 'push   cx
  3748. DATA &H8B,&H4E,&H06    : 'mov    cx, [bp + 6]
  3749. DATA &H8B,&H5E,&H08    : 'mov    bx, [bp + 8]
  3750. DATA &H8B,&H07         : 'mov    ax, [bx]
  3751. DATA &HD2,&HC8         : 'ror    al, cl
  3752. DATA &H89,&H07         : 'mov    [bx], ax
  3753. DATA &H59              : 'pop    cx
  3754. DATA &H5D              : 'pop    bp
  3755. DATA &HCA,&H04,&H00    : 'retf   4
  3756. REM $STATIC
  3757. DEFSNG A-Z
  3758. SUB RotateArray (SourceArray%(), TargetArray%(), Angle%)
  3759. DIM SourcePix%(1 TO 4)
  3760. DIM SourceBitsPP%, SourceBytesPerRow&, SourceRowOffset&
  3761. DIM SourceX%, SourceY%, BytePosCopy&, SourceBytePos&
  3762. DIM SourceRightMove%, SourceBitMask%, SourceToTargetDiff%
  3763. DIM TargetBitsPP%, TargetBytesPerRow&, TargetRowOffset&
  3764. DIM TargetRightMove%, TargetBytePos&, TargetX%, TargetY%
  3765. DIM WhichBits%, NumCols%, NumRows%
  3766. SELECT CASE BitsPP%
  3767.   CASE 1
  3768.     WhichBits% = 7
  3769.   CASE 2
  3770.     WhichBits% = 3
  3771.   CASE 8
  3772.     WhichBits% = 0
  3773. END SELECT
  3774. SourceBitsPP% = SourceArray%(0)
  3775. NumCols% = SourceBitsPP% \ BitsPP%
  3776. NumRows% = SourceArray%(1)
  3777. IF Angle% MOD 180 THEN
  3778.   'Make it square if it's not!!!
  3779.   SELECT CASE NumRows% - NumCols%
  3780.     CASE IS < 0
  3781.       NumCols% = NumRows%
  3782.     CASE IS > 0
  3783.       NumRows% = NumCols%
  3784.   END SELECT
  3785. END IF
  3786. TargetBitsPP% = NumCols% * BitsPP%
  3787. IF TargetBitsPP% AND 7 THEN
  3788.   TargetBytesPerRow& = (TargetBitsPP% \ 8 + 1) * Planes%
  3789. ELSE
  3790.   TargetBytesPerRow& = (TargetBitsPP% \ 8) * Planes%
  3791. END IF
  3792. REDIM TargetArray%(0 TO ((TargetBytesPerRow& * NumRows%) \ 2) + 2)
  3793. TargetArray%(0) = TargetBitsPP%
  3794. TargetArray%(1) = NumRows%
  3795. TargetBytesPerPlane% = TargetBytesPerRow& \ Planes%
  3796. IF SourceBitsPP% MOD 8 THEN
  3797.   SourceBytesPerPlane% = (SourceBitsPP% \ 8 + 1)
  3798. ELSE
  3799.   SourceBytesPerPlane% = (SourceBitsPP% \ 8)
  3800. END IF
  3801. SourceBytesPerRow& = SourceBytesPerPlane% * Planes%
  3802. SourceRowOffset& = 4
  3803. SourceBytePos& = SourceRowOffset&
  3804. SourceRightMove% = 0
  3805. SourceBitMask% = MaskBits%
  3806. FOR SourceY% = 0 TO NumRows% - 1
  3807.   FOR SourceX% = 0 TO NumCols% - 1
  3808.     SELECT CASE Angle%
  3809.       CASE 90
  3810.         TargetX% = NumRows% - SourceY% - 1
  3811.         TargetY% = NumCols% - SourceX% - 1
  3812.       CASE 180
  3813.         TargetX% = NumCols% - SourceX% - 1
  3814.         TargetY% = NumRows% - SourceY% - 1
  3815.       CASE 270
  3816.         TargetX% = SourceY%
  3817.         TargetY% = SourceX%
  3818.       CASE ELSE
  3819.         TargetX% = SourceX%
  3820.         TargetY% = SourceY%
  3821.     END SELECT
  3822.     TargetRowOffset& = (TargetY% * TargetBytesPerRow&) + 4
  3823.     TargetBytePos& = TargetRowOffset& + ((TargetX% * BitsPP%) \ 8)
  3824.     TargetRightMove% = TargetX% AND WhichBits%
  3825.     IF BitsPP% = 2 THEN
  3826.       TargetRightMove% = TargetRightMove% + TargetRightMove%
  3827.     END IF
  3828.     SourceToTargetDiff% = (TargetRightMove% - SourceRightMove% + 8) AND 7
  3829.     BytePosCopy& = SourceBytePos&
  3830.     DEF SEG = VARSEG(SourceArray%(0))
  3831.     FOR PlaneNum% = 1 TO Planes%
  3832.       SourcePix%(PlaneNum%) = (PEEK(BytePosCopy&) AND SourceBitMask%)
  3833.       BytePosCopy& = BytePosCopy& + SourceBytesPerPlane%
  3834.     NEXT
  3835.     IF SourceToTargetDiff% THEN
  3836.       DEF SEG
  3837.       RotRight% = VARPTR(RORproc%(1))
  3838.       FOR PlaneNum% = 1 TO Planes%
  3839.         CALL ABSOLUTE(SourcePix%(PlaneNum%), BYVAL_
  3840.  SourceToTargetDiff%, RotRight%)
  3841.       NEXT
  3842.     END IF
  3843.     DEF SEG = VARSEG(TargetArray%(0))
  3844.     FOR PlaneNum% = 1 TO Planes%
  3845.       POKE TargetBytePos&, PEEK(TargetBytePos&) OR SourcePix%(PlaneNum%)
  3846.       TargetBytePos& = TargetBytePos& + TargetBytesPerPlane%
  3847.     NEXT
  3848.     DEF SEG
  3849.     SourceRightMove% = (SourceRightMove% + BitsPP%) AND 7
  3850.     IF SourceBitMask% AND 1 THEN
  3851.       SourceBitMask% = MaskBits%
  3852.       SourceBytePos& = SourceBytePos& + 1
  3853.     ELSE
  3854.       RotRight% = VARPTR(RORproc%(1))
  3855.       CALL ABSOLUTE(SourceBitMask%, BYVAL BitsPP%, RotRight%)
  3856.     END IF
  3857.   NEXT
  3858.   SourceRowOffset& = SourceRowOffset& + SourceBytesPerRow&
  3859.   SourceBytePos& = SourceRowOffset&
  3860.   SourceBitMask% = MaskBits%
  3861.   SourceRightMove% = 0
  3862. NEXT
  3863. END SUB
  3864.  
  3865. --- D'Bridge 1.30/071082
  3866.  * Origin: RadioLink! Columbus, OH (614)766-2162 HST/DS (1:226/140)
  3867.  
  3868.  
  3869. ------------------------------------------------------------------------
  3870.   The QuickBASIC Scrapbook                                  
  3871.                                                             
  3872.   Vol 1, Issue 1                                            January 1993
  3873. ------------------------------------------------------------------------
  3874. ════════════════════════════════════════════════════════════════════════════════
  3875.  Area:    QuickBasic
  3876.   Msg:    #5888
  3877.  Date:    12-11-92 13:32 (Public) 
  3878.  From:    SCOTT MAYFIELD           
  3879.  To:      TERRY ROSSI              
  3880.  Subject: WORD WRAP CODE           
  3881. ────────────────────────────────────────────────────────────────────────────────
  3882. TR-=>A am becoming brain dead in my old age and cannot fiqure out how to 
  3883. handle
  3884. TR-=>problem.  I need to break a line that i read in from file A into two line
  3885. TR-=>file B, I am able to do that but I cannot fiqure out a good way to do a 
  3886. wo
  3887. TR-=>wrap.  Right now the software breaks the line at column 79 regardless of 
  3888. w
  3889. TR-=>the word ends.  I would like to have it break at the closest space to 
  3890. colu
  3891. TR-=>so the the next line begins with a complete word.   Anybody have any 
  3892. ideas
  3893.  
  3894. I'll leave you to figger out most of the code ;), but here's your
  3895. algorithm...
  3896.  
  3897. Read in your line from file A
  3898. strip off any trailing blanks (RTRIM$())
  3899. starting at the end, locate the space character closest to the end.
  3900.   FOR I% = LEN(TextFromA$) TO 1 STEP -1
  3901.     IF MID$(TextFromA$, I%, 1) = " " THEN
  3902.       SpaceLocation% = I%
  3903.       EXIT FOR
  3904.     END IF
  3905.   NEXT I%
  3906.   IF SpaceLoc% = 0 THEN SpaceLoc% = 79 ' No space in string, use whole
  3907.                                        ' thing...
  3908. Assign string 1 to be the left SpaceLoc%-1 characters of TextFromA$
  3909. Assign String 2 to be thr right Len(TextFromA$)-SpaceLoc% characters of
  3910.   TextFromA$
  3911. write out string 1 to file B
  3912. loop back, reading next line from A and adding string 2 to the beginning
  3913.   of it.
  3914.  
  3915. Scott @ 1:234/2
  3916.  
  3917.  
  3918.  * SLMR 2.1 * On a clear disk you can seek forever
  3919.  
  3920. --- TMail v1.31
  3921.  * Origin: Toledo's TBBS, 4+ gigs, 50,000 files 313-854-6001 (1:234/2)
  3922.  
  3923.  
  3924. ------------------------------------------------------------------------
  3925.   The QuickBASIC Scrapbook                                  
  3926.                                                             
  3927.   Vol 1, Issue 1                                            January 1993
  3928. ------------------------------------------------------------------------
  3929. ════════════════════════════════════════════════════════════════════════════════
  3930.  Area:    QuickBasic
  3931.   Msg:    #6624
  3932.  Date:    12-13-92 02:03 (Public) 
  3933.  From:    JOE NEGRON               
  3934.  To:      BOB OEHRLE               
  3935.  Subject: Date$   ???              
  3936. ────────────────────────────────────────────────────────────────────────────────
  3937. BO> While in Dos if I call for the date I get Wed-12-12-92. If I print
  3938.   > date$ in qb4.5 I get 12-12-92.  Is there away that I can get the days
  3939.   > to print ?? It seems that if I use Mid$ function I can't extract Wed .
  3940.   > I'm trying to write a calendar routine that will alert me at start up
  3941.   > every wednesday to preform a particular job.
  3942.   > Bob in NJ
  3943.  
  3944. BASIC's DATE$ function does not return the day of the week.  The
  3945. following does:
  3946. ============================== Begin code ==============================
  3947. DEFINT A-Z
  3948.  
  3949. '$INCLUDE: 'qbx.bi'
  3950.  
  3951. DECLARE FUNCTION DOW$ ()
  3952.  
  3953. PRINT DOW$
  3954.  
  3955. SYSTEM
  3956.  
  3957. '***********************************************************************
  3958. '* FUNCTION DOW$
  3959. '*
  3960. '* PURPOSE
  3961. '*    Uses DOS ISR 21H, Function 2AH (Get Date) to return the current
  3962. '*    day of the week.
  3963. '*
  3964. '* EXTERNAL ROUTINE(S)
  3965. '*    QBX.LIB
  3966. '*    -------
  3967. '*    SUB Interrupt (IntNum%, IRegs AS RegType, ORegs AS RegType)
  3968. '***********************************************************************
  3969. FUNCTION DOW$ STATIC
  3970.    DIM IRegs AS RegType, ORegs AS RegType
  3971.  
  3972.    IRegs.ax = &H2A00                         'Function 2AH (Get Date)
  3973.    Interrupt &H21, IRegs, ORegs              'Call DOS
  3974.    al% = ORegs.ax AND &HFF                   'extract al register
  3975.    DOW$ = MID$("SunMonTueWedThuFriSat", (al% + 1) * 3 - 2, 3)
  3976. END FUNCTION
  3977. =============================== End code ===============================
  3978.  
  3979. If you are using QB 4.5, replace "'qbx.bi'" with 'qb.bi'.  You must also
  3980. start QB up with the following command:
  3981.  
  3982.    C:\>qb /l
  3983.  
  3984. Of course, this will only work if you want the *current* day of the
  3985. week.  If you want to get the day of the week for dates other than the
  3986. current date, you need to use what are called "serial" dates; what you
  3987. do, in essence, is to convert the date into a serial ("in sequence")
  3988. number.  Once you have done that, you can do all sorts of calculations
  3989. on it.
  3990.  
  3991.                                 --Joe in Bay Ridge, Brooklyn, NY--
  3992.                                       Sun  12-13-1992, 02:01
  3993.  
  3994.  * SLMR 2.1a * Tagline Subsystem down at this time...
  3995.  
  3996. --- Maximus 2.01wb
  3997.  * Origin: * BlueDog BBS * (212) 594-4425 * NYC FileBone Hub (1:278/709)
  3998.  
  3999.  
  4000. ------------------------------------------------------------------------
  4001.   The QuickBASIC Scrapbook                                  
  4002.                                                             
  4003.   Vol 1, Issue 1                                            January 1993
  4004. ------------------------------------------------------------------------
  4005. ════════════════════════════════════════════════════════════════════════════════
  4006.  Area:    QuickBasic
  4007.   Msg:    #6625
  4008.  Date:    12-13-92 02:10 (Public) 
  4009.  From:    JOE NEGRON               
  4010.  To:      JOHN GALLAS              
  4011.  Subject: keyboard repeat speed    
  4012. ────────────────────────────────────────────────────────────────────────────────
  4013. JG> Is there any way I can increase the keyboard repeat speed?
  4014.  
  4015. Here you go:
  4016.  
  4017. ============================== Begin code ==============================
  4018. DEFINT A-Z
  4019.  
  4020. '$INCLUDE: 'qbx.bi'
  4021.  
  4022. DECLARE SUB SetKBRate (InitDelay%, RepeatRate%)
  4023.  
  4024. SetKBRate 35, 250
  4025.  
  4026. SYSTEM
  4027.  
  4028. '***********************************************************************
  4029. '* SUB SetKBRate
  4030. '*
  4031. '* PURPOSE
  4032. '*    Uses BIOS ISR 16H, Service 03H (Set Typematic Rate and Delay) to
  4033. '*    set the typematic rate of an AT keyboard.
  4034. '*
  4035. '* EXTERNAL ROUTINE(S)
  4036. '*    QBX.LIB
  4037. '*    -------
  4038. '*    SUB Interrupt (IntNum%, IRegs AS RegType, ORegs AS RegType)
  4039. '***********************************************************************
  4040. SUB SetKBRate (InitDelay%, RepeatRate%) STATIC
  4041.    DIM IRegs AS RegType, ORegs AS RegType
  4042.  
  4043.    IRegs.ax = &H305
  4044.    IRegs.bx = InitDelay% * 256 + RepeatRate%
  4045.    Interrupt &H16, IRegs, ORegs
  4046. END SUB
  4047. =============================== End code ===============================
  4048.  
  4049. Make sure that you start QB with the "/L" command line switch.
  4050.  
  4051. Note that you *must* have an AT for this routine to work.
  4052.  
  4053.                                 --Joe in Bay Ridge, Brooklyn, NY--
  4054.                                       Sun  12-13-1992, 02:10
  4055.  
  4056.  * SLMR 2.1a * Press Esc to load the BBS, or Alt-H for IQ test.
  4057.  
  4058. --- Maximus 2.01wb
  4059.  * Origin: * BlueDog BBS * (212) 594-4425 * NYC FileBone Hub (1:278/709)
  4060.  
  4061.  
  4062. ------------------------------------------------------------------------
  4063.   The QuickBASIC Scrapbook                                  
  4064.                                                             
  4065.   Vol 1, Issue 1                                            January 1993
  4066. ------------------------------------------------------------------------
  4067. ════════════════════════════════════════════════════════════════════════════════
  4068.  Area:    QuickBasic
  4069.   Msg:    #6626
  4070.  Date:    12-13-92 02:18 (Public) 
  4071.  From:    JOE NEGRON               
  4072.  To:      MIKE JASKO               
  4073.  Subject: pause                    
  4074. ────────────────────────────────────────────────────────────────────────────────
  4075. MJ> I would like to know how to put a simple pause in a QuickBasic
  4076.   > program.  For example, I want it to display a message when the program
  4077.   > is ending and I want it to stay on the screen for a certin amount of
  4078.   > time.  Thanx in advance!!!
  4079.  
  4080. If you have PDS, you can use SLEEP:
  4081.  
  4082.    SLEEP number-of-seconds
  4083.  
  4084. If you have QB, you can use the following:
  4085.  
  4086. ============================== Begin code ==============================
  4087. DEFINT A-Z
  4088.  
  4089. DECLARE SUB Pause (Ticks&)
  4090.  
  4091. DECLARE FUNCTION ClockTicks& ()
  4092.  
  4093. 'Pause for 10 seconds:
  4094. Pause 182
  4095.  
  4096. SYSTEM
  4097.  
  4098. '***********************************************************************
  4099. '* FUNCTION ClockTicks&
  4100. '*
  4101. '* PURPOSE
  4102. '*    Returns the number of clock ticks since midnight.
  4103. '***********************************************************************
  4104. FUNCTION ClockTicks& STATIC
  4105.    DEF SEG = &H40
  4106.    ClockTicks& = PEEK(&H6C) + PEEK(&H6D) * 256& + PEEK(&H6E) * 65536
  4107.    DEF SEG
  4108. END FUNCTION
  4109.  
  4110. '***********************************************************************
  4111. '* SUB Pause
  4112. '*
  4113. '* PURPOSE
  4114. '*    Pauses a specified number of clock ticks.  The clock ticks
  4115. '*    approximately 18.2 times per second.
  4116. '*
  4117. '* INTERNAL ROUTINE(S)
  4118. '*    FUNCTION ClockTicks& ()
  4119. '***********************************************************************
  4120. SUB Pause (Ticks&) STATIC
  4121.    D& = ClockTicks& + Ticks&
  4122.  
  4123.    IF D& > 1573038 THEN
  4124.       D& = D& - 1573039
  4125.       DO WHILE ClockTicks& > 1
  4126.       LOOP
  4127.    END IF
  4128.  
  4129.    DO WHILE ClockTicks& < D&
  4130.       IF INKEY$ > "" THEN
  4131.          EXIT SUB
  4132.       END IF
  4133.    LOOP
  4134. END SUB
  4135. =============================== End code ===============================
  4136.  
  4137. The only real functional difference between these two methods is that
  4138. although PDS's SLEEP will quit if a key is pressed before the specified
  4139. period of time elapses, it will *not* remove the key from the keyboard
  4140. buffer while my Pause SUB will.
  4141.  
  4142.                                 --Joe in Bay Ridge, Brooklyn, NY--
  4143.                                       Sun  12-13-1992, 02:18
  4144.  
  4145.  * SLMR 2.1a * You can observe a lot just by watching.
  4146.  
  4147. --- Maximus 2.01wb
  4148.  * Origin: * BlueDog BBS * (212) 594-4425 * NYC FileBone Hub (1:278/709)
  4149.  
  4150.  
  4151. ------------------------------------------------------------------------
  4152.   The QuickBASIC Scrapbook                                  
  4153.                                                             
  4154.   Vol 1, Issue 1                                            January 1993
  4155. ------------------------------------------------------------------------
  4156. ════════════════════════════════════════════════════════════════════════════════
  4157.  Area:    QuickBasic
  4158.   Msg:    #6729
  4159.  Date:    12-13-92 06:41 (Public) 
  4160.  From:    DICK DENNISON            
  4161.  To:      BOB OEHRLE               
  4162.  Subject: Date$   ???              
  4163. ────────────────────────────────────────────────────────────────────────────────
  4164. BO> While in Dos if I call for the date I get Wed-12-12-92. If I print
  4165. BO> date$ in qb4.5 I get 12-12-92.  Is there away that I can get the days
  4166. BO> to print ?? It seems that if I use Mid$ function I can't extract Wed .
  4167. BO> I'm trying to write a calendar routine that will alert me at start up
  4168. BO> every wednesday to preform a particular job.
  4169. BO> Bob in NJ
  4170.   
  4171. 'Try this:
  4172.  
  4173. 'Day of Week - Dick Dennison 10/26/89
  4174. '$INCLUDE: 'qb.bi'    'load qb with the /L switch
  4175. 'Interrupt 21 Function 2AH - get date
  4176. DIM InRegs AS RegType, OutRegs AS RegType
  4177. DIM Day(7) AS STRING * 3
  4178. Day$(0) = "Sun": Day$(1) = "Mon": Day$(2) = "Tue": Day$(3) = "Wed"
  4179. Day$(4) = "Thu": Day$(5) = "Fri": Day$(6) = "Sat"
  4180. CLS
  4181. InRegs.ax = &H2A * 256   '2Ah in ah
  4182. CALL INTERRUPT(&H21, InRegs, OutRegs)
  4183. ' * * * cx is the year, dh is the month, dl is the date, al is the day
  4184. PRINT OutRegs.cx; " = year"
  4185. PRINT OutRegs.dx \ 256; " = month"
  4186. PRINT OutRegs.dx MOD 256; " = date"
  4187. daynum% = OutRegs.ax MOD 256
  4188. PRINT "Day of the week is "; Day$(daynum%)
  4189.  
  4190.  
  4191. --- VP [DOS] V4.09e
  4192.  * Origin: The MailMan  (914)374-3903 NY Quick Share Pt #7 *HST (1:272/34)
  4193.  
  4194.  
  4195. ------------------------------------------------------------------------
  4196.   The QuickBASIC Scrapbook                                  
  4197.                                                             
  4198.   Vol 1, Issue 1                                            January 1993
  4199. ------------------------------------------------------------------------
  4200. ════════════════════════════════════════════════════════════════════════════════
  4201.  Area:    QuickBasic
  4202.   Msg:    #8170
  4203.  Date:    12-13-92 18:57 (Public) 
  4204.  From:    PETER BARNEY             
  4205.  To:      CRUZ MONCIVAIS           
  4206.  Subject: Loading .GIF and .PCX    
  4207. ────────────────────────────────────────────────────────────────────────────────
  4208.  >  PB> Your reply chain got tangled.  You should've sent the reply to Harry
  4209.  >  PB> Gish. He did post some code for 256-pcx though.  Did you get it?
  4210.  
  4211.  >  No I did not get that code?   Is it possible to re-post?
  4212.  
  4213. I don't have the EXACT original code (it was written in ZBASIC, I converted 
  4214. to QB), hope you don't mind Harry.
  4215.  
  4216. '(1127)  Sat 21 Nov 92  1:56p
  4217. 'By: Harry Gish
  4218. 'To: All
  4219. 'Re: 256 color PCX reader
  4220. 'St:
  4221. '---------------------------------------------------------------------------
  4222.  
  4223. DEFINT A-Z
  4224. SCREEN 13
  4225.  
  4226. FileName$ = "256COLOR.PCX"  'fill in the blank
  4227. OPEN FileName$ FOR BINARY AS #2 LEN = 11
  4228. 'Size# must be set to actual PCX file size in bytes
  4229. Size# = LOF(2)
  4230.  
  4231. 'The first 128 bytes in the file are a header.
  4232. 'Much of it is unused, or of no practical use.
  4233. 'For simplicity we'll cover the important ones only.
  4234.  
  4235. header$ = SPACE$(128)
  4236. GET #2, , header$: CLS
  4237.  
  4238. 'The first position is a PCX 'signature'.
  4239.  
  4240. Sig$ = LEFT$(header$, 1)
  4241. IF Sig$ <> CHR$(10) THEN PRINT "Invalid PCX file, no ZSoft header found": END
  4242.  
  4243. 'The next header byte specifies the version.
  4244. 'For 256 color it must be 5.
  4245.  
  4246. Ver$ = MID$(header$, 2, 1): Ver = ASC(Ver$)
  4247. IF Ver <> 0 AND Ver <> 2 AND Ver <> 3 AND Ver <> 5 THEN PRINT "Invalid 
  4248. version number": END
  4249.  
  4250. 'The next header byte specifies the color bits.
  4251. 'For 256 color it must be 8.
  4252.  
  4253. ColorBits$ = MID$(header$, 4, 1): ColorBits = ASC(ColorBits$)
  4254. IF ColorBits <> 1 AND ColorBits <> 8 THEN PRINT "Invalid number of color 
  4255. bits": END
  4256.  
  4257. 'The image size is contained in 4 bytes
  4258. 'starting at position 9 of the header.
  4259.  
  4260. XRes$ = MID$(header$, 9, 2)
  4261. XRes1$ = LEFT$(XRes$, 1): XRes2$ = RIGHT$(XRes$, 1)
  4262. XRes = ASC(XRes1$) + ASC(XRes2$) * 256 + 1
  4263.  
  4264. YRes$ = MID$(header$, 11, 2)
  4265. YRes1$ = LEFT$(YRes$, 1): YRes2$ = RIGHT$(YRes$, 1)
  4266. YRes = ASC(YRes1$) + ASC(YRes2$) * 256 + 1
  4267.  
  4268. '256 Color PCX
  4269.  
  4270. Bytes# = 128
  4271. Pointer = 0
  4272.  
  4273. 'The palette information (definitions of the 256 colors)
  4274. 'is contained in the last 768 bytes of the file. There
  4275. 'is a "leading check-byte" of 0C (hex) preceding it.
  4276. 'Here we're positioning to that check-byte.
  4277.  
  4278. SEEK #2, Size# - 769
  4279. a$ = " "
  4280. GET #2, , a$
  4281.  
  4282. 'Now we read the next 768 bytes {256 x 3 for Red,
  4283. 'Green and Blue definitions respectively}. Current
  4284. 'paletting for PCX requires division by 4. If there
  4285. 'is a "true-color" PCX format {and there may be and
  4286. 'I don't know about it} I'd expect it to simply drop
  4287. 'the division by 4 and make it the actual number.
  4288.  
  4289. FOR X = 0 TO 255
  4290.     a$ = "   "
  4291.     GET #2, , a$
  4292.     R = (ASC(MID$(a$, 1, 1)) / 4) AND 63
  4293.     G = (ASC(MID$(a$, 2, 1)) / 4) AND 63
  4294.     B = (ASC(MID$(a$, 3, 1)) / 4) AND 63
  4295.     PALETTE X, R + G * 256 + B * 65536
  4296. NEXT
  4297.  
  4298. 'Now we position at the 128th byte,
  4299. 'which is where the data begins.
  4300.  
  4301. SEEK #2, 128
  4302.  
  4303. 'Read a byte
  4304.  
  4305. DecodeGroup:
  4306. X$ = " "
  4307. IF EOF(2) THEN GOTO done
  4308. GET #2, , X$: X = ASC(X$): Bytes# = Bytes# + 1
  4309.  
  4310. 'Now we must see if the byte represents a single color
  4311. 'value or if it is a multiplier value. A quirk of 256
  4312. 'COLOR PCX's is that a single value of the top 64 colors
  4313. 'must be encoded as a multiplier of 1 times the color.
  4314. 'You can't say COLOR 255, you must say 1 times 255. This
  4315. 'makes many 256 color PCX files actually larger than a
  4316. 'simple value dump. In this case if the byte value is
  4317. 'less than 193 then it is an actual value.
  4318.  
  4319. 'LONGIF ? - Harry, what the heck does LONGIF mean?
  4320. IF X < 193 THEN
  4321.     PSET (Pointer, LineNo), X
  4322.     Pointer = Pointer + 1
  4323. END IF
  4324.  
  4325. 'Otherwise we interpret it as a multiplier.
  4326. 'Multiplier value can be as large as 63.
  4327.  
  4328. 'LONGIF ? - again?
  4329. IF X > 192 THEN
  4330.     X = X - 192:
  4331.     X$ = " "
  4332.     GET #2, , X$: y = ASC(X$): Bytes# = Bytes# + 1
  4333.     LINE (Pointer, LineNo)-(Pointer + X - 1, LineNo), y
  4334.     Pointer = Pointer + X
  4335. END IF
  4336.  
  4337. 'Pointer notes the current position in the X line scan.
  4338. 'When the line is done Pointer gets reset to zero.
  4339.  
  4340. IF Pointer < XRes GOTO DecodeGroup
  4341. Pointer = 0
  4342.  
  4343. 'If we're at end of line now we need to see if all lines are decoded.
  4344. 'If so we end, otherwise we start processing the next line.
  4345.  
  4346. IF LineNo = YRes GOTO done
  4347.  
  4348. LineNo = LineNo + 1
  4349. GOTO DecodeGroup
  4350.  
  4351. done:
  4352. BEEP
  4353. WHILE INKEY$ = "": WEND
  4354. SCREEN 2, 1: SCREEN 0, 0: COLOR 15, 1, 4: CLS : END
  4355.  
  4356. --- FMail 0.92
  4357.  * Origin: Pete's Place - Toledo, Ohio (1:234/35.1)
  4358.  
  4359.  
  4360. ------------------------------------------------------------------------
  4361.   The QuickBASIC Scrapbook                                  
  4362.                                                             
  4363.   Vol 1, Issue 1                                            January 1993
  4364. ------------------------------------------------------------------------
  4365. ════════════════════════════════════════════════════════════════════════════════
  4366.  Area:    QuickBasic
  4367.   Msg:    #8174
  4368.  Date:    12-13-92 19:31 (Public) 
  4369.  From:    PETER BARNEY             
  4370.  To:      JOHN GALLAS              
  4371.  Subject: keyboard repeat speed    
  4372. ────────────────────────────────────────────────────────────────────────────────
  4373.  > Is there any way I can increase the keyboard repeat speed?
  4374.  
  4375. '$INCLUDE: 'QBX.BI' or QB.BI
  4376. SUB KeySpeed (rate, delay)
  4377.  
  4378. 'Sets the cursor typematic keyrate.  Rate is the speed at which
  4379. 'the keys repeat, the range is from 0 to 31, 0 being fastest.
  4380. 'Delay is the amount of time in 250 millisecond parts before the
  4381. 'keys begin to repeat.  The range is from 0 to 3, 0 being the
  4382. 'shortest wait.
  4383.  
  4384. DIM Regs AS RegType
  4385. Regs.ax = &H305
  4386. Regs.bx = (delay AND 3) * 256 + (rate AND 31)
  4387. CALL Interrupt(&H16, Regs, Regs)
  4388. END SUB
  4389.  
  4390. --- FMail 0.92
  4391.  * Origin: Pete's Place - Toledo, Ohio (1:234/35.1)
  4392.  
  4393.  
  4394. ------------------------------------------------------------------------
  4395.   The QuickBASIC Scrapbook                                  
  4396.                                                             
  4397.   Vol 1, Issue 1                                            January 1993
  4398. ------------------------------------------------------------------------
  4399. ════════════════════════════════════════════════════════════════════════════════
  4400.  Area:    QuickBasic
  4401.   Msg:    #3811
  4402.  Date:    12-12-92 04:23 (Public) 
  4403.  From:    DAVE NAPLES              
  4404.  To:      STEVE DEMO               
  4405.  Subject: directory tree           
  4406. ────────────────────────────────────────────────────────────────────────────────
  4407. │» I do have one question, Is it possible to find out what Drive and Dir     
  4408. │» you are in with out doing the following:                                  
  4409. ╘═══════════════════════════════════════════════════════════════════════════
  4410.  
  4411.     Two interrupts allow you to do these things. Remember, you have to have 
  4412. the QB library loaded into the environment:
  4413.  
  4414. '$INCLUDE: 'QB.BI'      'Include definitions for INTERRUPT and
  4415.                         'INTERRUPTX
  4416.  
  4417. DIM regs AS RegType, regsx AS RegTypeX
  4418.                         'Dimension user-defined arrays
  4419.  
  4420. FindDir
  4421.  
  4422.  
  4423.  
  4424. SUB FindDir ()
  4425.  
  4426. regsx.ax = &H1900       'Load the value 19H into the high byte of
  4427.                         'the AX register
  4428.  
  4429. INTERRUPTX &H21, regsx, regsx
  4430.                         'Call the interrupt
  4431.  
  4432. drive = VAL("&H" + RIGHT$(HEX$(regsx.ax), 2))
  4433.                         'Assign the returned drive number to the
  4434.                         'variable «drive». 0 = A:, 1 = B:, etc.
  4435.  
  4436. DIM buffer AS STRING * 128
  4437.                         'Allocate a buffer to store the returned
  4438.                         'path name
  4439.  
  4440. regsx.ax = &H4700       'Load the high byte of the AX register with
  4441.                         'the value 47H
  4442.  
  4443. regsx.dx = drive        'Load the drive number into the low byte of
  4444.                         'the DX register
  4445.  
  4446. regsx.ds = VARSEG(buffer)
  4447.                         'Load the data segment address of the
  4448.                         'buffer into the DS register
  4449.  
  4450. regsx.si = VARPTR(buffer)
  4451.                         'Load the offset address of the buffer into
  4452.                         'the SI register
  4453.  
  4454. INTERRUPTX &H21, regsx, regsx
  4455.                         'Call the interrupt
  4456.  
  4457. IF (regsx.flags AND 1) = 0 then                 'If the operation
  4458.     LOCATE 1, 1: PRINT "DIRECTORY FOUND"        'was completed
  4459. ELSE                                            'successfully
  4460.     LOCATE 1, 1: PRINT "DEVICE UNAVAILABLE"
  4461. END IF
  4462. END SUB
  4463.  
  4464.     This should do the trick. It also goes a helluva lot faster
  4465. than shelling to DOS, writing a sequential file, then reading from the file. 
  4466. Hope it helps.
  4467.  
  4468.  
  4469.  
  4470.  
  4471.                         The Resident Scholar
  4472.  
  4473.  ■ MegaMail 2.10 #0:"Can't we all just get along?" - G.A. Custer
  4474.  
  4475. --- SLMAIL v3.0/WL  (#0109)
  4476.  * Origin: Burleigh's BBS - 703-898-8153/898-2980 Philez,Jamez,Mzgz,K-Rad! 
  4477. (1:274/6)
  4478.  
  4479.  
  4480. ------------------------------------------------------------------------
  4481.   The QuickBASIC Scrapbook                                  
  4482.                                                             
  4483.   Vol 1, Issue 1                                            January 1993
  4484. ------------------------------------------------------------------------
  4485. ════════════════════════════════════════════════════════════════════════════════
  4486.  Area:    QuickBasic
  4487.   Msg:    #3812
  4488.  Date:    12-14-92 17:39 (Public) 
  4489.  From:    DAVE NAPLES              
  4490.  To:      MARK BUTLER              
  4491.  Subject: Alphabetizer FUNCTION    
  4492. ────────────────────────────────────────────────────────────────────────────────
  4493. │» How would you combine two string arrays? I am writing a program that      
  4494. │» needs to combine the filespec matches from the current directory with     
  4495. │» those found in another into one filename array and display the result     
  4496. │» for a tag-list. I came up with something that halfway works but           
  4497. │» looking back over my spaghetti pile of code I figgered "there has to      
  4498. │» be any easier, cleaner way than this!" ... you know of an easy way to     
  4499. │» append two such arrays?                                                   
  4500. ╘═══════════════════════════════════════════════════════════════════════════
  4501.  
  4502.     Try this fer size:
  4503.  
  4504. DIM array1(100), array2(100), array3(200)
  4505.     :
  4506.     :
  4507.     :
  4508.     :
  4509.     :program code
  4510.     :
  4511.     :
  4512.     :
  4513.     :
  4514. FOR A = 1 TO 200
  4515. FOR B = 1 TO 100
  4516. array3(A) = array1(B)
  4517. NEXT B
  4518. FOR C = 1 TO 100
  4519. array3(A) = array2(C)
  4520. NEXT C
  4521. NEXT A
  4522.  
  4523.     Kind of a kludge, but it'll work ...
  4524.  
  4525.  
  4526.  
  4527.                         The Resident Scholar
  4528.  
  4529.  ■ MegaMail 2.10 #0:Fer pete's sake, don't try this tagline at home!
  4530.  
  4531. --- SLMAIL v3.0/WL  (#0109)
  4532.  * Origin: Burleigh's BBS - 703-898-8153/898-2980 Philez,Jamez,Mzgz,K-Rad! 
  4533. (1:274/6)
  4534.  
  4535.  
  4536. ------------------------------------------------------------------------
  4537.   The QuickBASIC Scrapbook                                  
  4538.                                                             
  4539.   Vol 1, Issue 1                                            January 1993
  4540. ------------------------------------------------------------------------
  4541. ════════════════════════════════════════════════════════════════════════════════
  4542.  Area:    QuickBasic
  4543.   Msg:    #3817
  4544.  Date:    12-14-92 17:57 (Public) 
  4545.  From:    DAVE NAPLES              
  4546.  To:      JOHN WOODGATE            
  4547.  Subject: Looking for code         
  4548. ────────────────────────────────────────────────────────────────────────────────
  4549. │»I know 3 ways to get that information, here's the pathetic way.            
  4550. ╘═══════════════════════════════════════════════════════════════════════════
  4551.  
  4552.     The NON-pathetic way runs thusly (remember, ya gotta have
  4553. QB.LIB ta run this:)
  4554.  
  4555. '$INCLUDE: 'qb.bi'
  4556.  
  4557. DIM regs AS RegType, regsx AS RegTypeX
  4558.  
  4559. regsx.ax = &H1A00
  4560. INTERRUPTX &H10, regsx, regsx
  4561. vmode = VAL("&H" + RIGHT$(HEX$(regsx.bx), 2))
  4562. SELECT CASE vmode
  4563.     CASE 0
  4564.         monitor$ = "No card installed"
  4565.     CASE 1
  4566.         monitor$ = "MDA Display"
  4567.     CASE 2
  4568.         monitor$ = "CGA Display"
  4569.     CASE 4
  4570.         monitor$ = "EGA or EGA Mutlisync Display"
  4571.     CASE 5
  4572.         monitor$ = "EGA Mono Display"
  4573.     CASE 7
  4574.         monitor$ = "VGA Analog Mono Display"
  4575.     CASE 8
  4576.         monitor$ = "VGA Analog or VGA Analog Multisync Display"
  4577.     CASE 255
  4578.         monitor$ = "Unknown Video Card Type"
  4579. END SELECT
  4580.  
  4581.     That does the trick. Hope it helps.
  4582.  
  4583.  
  4584.                         The Resident Scholar
  4585.  
  4586.  ■ MegaMail 2.10 #0:"Do me WILD, baby!" - P. Schlafly
  4587.  
  4588. --- SLMAIL v3.0/WL  (#0109)
  4589.  * Origin: Burleigh's BBS - 703-898-8153/898-2980 Philez,Jamez,Mzgz,K-Rad! 
  4590. (1:274/6)
  4591.  
  4592.  
  4593. ------------------------------------------------------------------------
  4594.   The QuickBASIC Scrapbook                                  
  4595.                                                             
  4596.   Vol 1, Issue 1                                            January 1993
  4597. ------------------------------------------------------------------------
  4598. ════════════════════════════════════════════════════════════════════════════════
  4599.  Area:    QuickBasic
  4600.   Msg:    #4053
  4601.  Date:    12-17-92 11:27 (Public) 
  4602.  From:    CORIDON HENSHAW          
  4603.  To:      ERIC B. FORD             
  4604.  Subject: *.MSG                    
  4605. ────────────────────────────────────────────────────────────────────────────────
  4606. Hello Eric!
  4607.  
  4608. In a msg of <15 Dec 92>, Eric B. Ford writes to Coridon Henshaw:
  4609.  
  4610.  >> For storing data that isn't in the header, use a kluge
  4611.  >> line.  The only "rule" is that they start with a
  4612.  >> CHR$(1) and have no CR or LF on the end.  Here's two
  4613.  >> examples from your message:
  4614.  
  4615.  >>  EBF> @MSGID: 1:3632/1.6 ab175def
  4616.  
  4617.  EBF> Ok, but how to I have a carrage return if I don't put one in?
  4618.  
  4619. Hold your questions.  I'm posting the FTSC standard for messages.  200+ lines 
  4620. folow.
  4621.  
  4622. ===Chop===
  4623. [...]
  4624.    4. Data Description
  4625.  
  4626.       A  language  specific  notation  was avoided.  Please help  stamp  out
  4627.       environmental  dependencies.   Only  you  can  prevent  PClone  market
  4628.       dominance.  Don't panic, there are rectangular record layouts too.
  4629.  
  4630.       (* non-terminals *)
  4631.       UpperCaseName - to be defined further on
  4632.  
  4633.       (* literals *)
  4634.       "ABC"         - ASCII character string, no termination implied
  4635.       nnH           - byte in hexadecimal
  4636.  
  4637.       (* terminals *)
  4638.       someName      - 16-bit integer, low order byte first (8080 style)
  4639.       someName[n]   - field of n bytes
  4640.       someName[.n]  - field of n bits
  4641.       someName(n)   - Null terminated string allocated n chars (incl Null)
  4642.       someName{max} - Null terminated string of up to max chars (incl Null)
  4643.  
  4644.       (* punctuation *)
  4645.       a b           - one 'a' followed by one 'b'
  4646.       ( a | b )     - either 'a' or 'b', but not both
  4647.       { a }         - zero or more 'a's
  4648.       [ b ]         - zero or one 'b'
  4649.       (* comment *) - ignored
  4650.  
  4651.       (* predeclared constant *)
  4652.       Null          = 00H
  4653. [...]
  4654.    1. Application Layer Data Definition : a Stored Message
  4655.  
  4656.                                Stored Message
  4657.  
  4658.        Offset
  4659.       dec hex
  4660.               .-----------------------------------------------.
  4661.         0   0 |                                               |
  4662.               ~                 fromUserName                  ~
  4663.               |                   36 bytes                    |
  4664.               +-----------------------+-----------------------+
  4665.        36  24 |                                               |
  4666.               ~                  toUserName                   ~
  4667.               |                   36 bytes                    |
  4668.               +-----------------------+-----------------------+
  4669.        72  48 |                                               |
  4670.               ~                    subject                    ~
  4671.               |                   72  bytes                   |
  4672.               +-----------------------+-----------------------+
  4673.       144  90 |                                               |
  4674.               ~                    dateTime                   ~
  4675.               |                    20 bytes                   |
  4676.               +-----------------------+-----------------------+
  4677.       164  A4 | timesRead (low order) | timesRead (high order)|
  4678.               +-----------------------+-----------------------+
  4679.       166  A6 | destNode (low order)  | destNode (high order) |
  4680.               +-----------------------+-----------------------+
  4681.       168  A8 | origNode (low order)  | origNode (high order) |
  4682.               +-----------------------+-----------------------+
  4683.       170  AA |   cost (low order)    |   cost (high order)   |
  4684.               +-----------------------+-----------------------+
  4685.       172  AC | origNet (low order)   | origNet (high order)  |
  4686.               +-----------------------+-----------------------+
  4687.       174  AE | destNet (low order)   | destNet (high order)  |
  4688.               +-----------------------+-----------------------+
  4689.       176  B0 |                     fill                      |
  4690.               ~                    8 bytes                    ~
  4691.               +-----------------------+-----------------------+
  4692.       184  B8 |  replyTo (low order)  |  replyTo (high order) |
  4693.               +-----------------------+-----------------------+
  4694.       186  BA | Attribute (low order) | Attribute (high order)|
  4695.               +-----------------------+-----------------------+
  4696.       188  BC | nextReply (low order) | nextReply (high order)|
  4697.               +-----------------------+-----------------------+
  4698.       190  BE |                      text                     |
  4699.               ~                    unbounded                  ~
  4700.               |                 null terminated               |
  4701.               `-----------------------------------------------'
  4702.  
  4703.  
  4704.                                                                            4
  4705.  
  4706.  
  4707.       Message    = fromUserName(36)  (* Null terminated *)
  4708.                    toUserName(36)    (* Null terminated *)
  4709.                    subject(72)       (* see FileList below *)
  4710.                    DateTime          (* message body was last edited *)
  4711.                    timesRead
  4712.                    destNode          (* of message *)
  4713.                    origNode          (* of message *)
  4714.                    cost              (* in lowest unit of originator's
  4715.                                         currency *)
  4716.                    origNet           (* of message *)
  4717.                    destNet           (* of message *)
  4718.                    fill[8]
  4719.                    replyTo           (* msg to which this replies *)
  4720.                    AttributeWord
  4721.                    nextReply         (* msg which replies to this *)
  4722.                    text(unbounded)   (* Null terminated *)
  4723.  
  4724.       DateTime   = (* a character string 20 characters long *)
  4725.                                      (* 01 Jan 86  02:34:56 *)
  4726.                    DayOfMonth " " Month " " Year " "
  4727.                    " " HH ":" MM ":" SS
  4728.                    Null
  4729.  
  4730.       DayOfMonth = "01" | "02" | "03" | ... | "31"   (* Fido 0 fills *)
  4731.       Month      = "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun" |
  4732.                    "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec"
  4733.       Year       = "01" | "02" | .. | "85" | "86" | ... | "99" | "00"
  4734.       HH         = "00" | .. | "23"
  4735.       MM         = "00" | .. | "59"
  4736.       SS         = "00" | .. | "59"
  4737.  
  4738.       AttributeWord   bit       meaning
  4739.                       ---       --------------------
  4740.                         0  +    Private
  4741.                         1  + s  Crash
  4742.                         2       Recd
  4743.                         3       Sent
  4744.                         4  +    FileAttached
  4745.                         5       InTransit
  4746.                         6       Orphan
  4747.                         7       KillSent
  4748.                         8       Local
  4749.                         9    s  HoldForPickup
  4750.                        10  +    unused
  4751.                        11    s  FileRequest
  4752.                        12  + s  ReturnReceiptRequest
  4753.                        13  + s  IsReturnReceipt
  4754.                        14  + s  AuditRequest
  4755.                        15    s  FileUpdateReq
  4756.  
  4757.                              s - this bit is supported by SEAdog only
  4758.                            + - this bit is not zeroed before packeting
  4759.  
  4760.       Bits numbers ascend with arithmetic significance of bit position.
  4761.  
  4762. ----------------------------------------------------------
  4763. --------------------- 
  4764.       Message Text
  4765.  
  4766.       Message text is unbounded and null terminated (note exception below).
  4767.  
  4768.       A 'hard' carriage return, 0DH,  marks the end of a paragraph, and must
  4769.       be preserved.
  4770.  
  4771.       So   called  'soft'  carriage  returns,  8DH,  may  mark  a   previous
  4772.       processor's  automatic line wrap, and should be ignored.  Beware  that
  4773.       they may be followed by linefeeds, or may not.
  4774.  
  4775.       All  linefeeds, 0AH, should be ignored.  Systems which display message
  4776.       text should wrap long lines to suit their application.
  4777.  
  4778.       If the first character of a physical line (e.g. the first character of
  4779.       the  message text, or the character immediately after a hard  carriage
  4780.       return (ignoring any linefeeds)) is a ^A (<control-A>, 01H), then that
  4781.       line  is  not  displayed  as  it  contains  control  information.  The
  4782.       convention for such control lines is:
  4783.         o They begin with ^A
  4784.         o They end at the end of the physical line (i.e. ignore soft <cr>s).
  4785.         o They begin with a keyword followed by a colon.
  4786.         o The keywords are uniquely assigned to applications.
  4787.         o They keyword/colon pair is followed by application specific data.
  4788.  
  4789.       Current ^A keyword assignments are:
  4790.       o TOPT <pt no> - origin point address
  4791.       o FMPT <pt no> - origin point address
  4792.       o INTL <dest z:n/n> <orig z:n/n> - used for inter-zone address
  4793.  
  4794.       In  order to provide minimal support for NAPLPS graphics, applications
  4795.       should  display without interpretation  any bytes found between  ????,
  4796.       ??H,  and ????, ??H.  The surrounded  data bytes may be any eight  bit
  4797.       characters  with the exception of  the terminating byte, ??H.  Do  not
  4798.       strip carriage returns, soft or hard, or linefeeds.
  4799.  
  4800. ----------------------------------------------------------
  4801. --------------------- 
  4802.       File Specifications
  4803.  
  4804.       If  one  or more  of FileAttached, FileRequest, or  FileUpdateReq  are
  4805.       asserted  in an AttributeWord, the subject{72} field is interpreted as
  4806.       a  list of file specifications  which may include wildcards and  other
  4807.       system-dependent data.  This list is of the form
  4808.  
  4809.       FileList = [ FileSpec { Sep FileSpec } ] Null
  4810.  
  4811.       FileSpec = (* implementation dependent file specification.  may
  4812.                     not contain Null or any of the characters in Sep. *)
  4813.  
  4814.       Sep      = ( " " | "," )  { " " }
  4815.  
  4816.  
  4817.  
  4818.  
  4819.       There are deviations from and additions to these specifications
  4820.  
  4821.       1  - Fido does not necessarily terminate the message text with a Null,
  4822.            but uses an empty line (0DH 0AH 0DH 0AH)
  4823.  
  4824.       2 - SEAdog zeros the message cost field when building a message.
  4825.  
  4826.       4 - SEAdog uses a different format for dates, e.g.
  4827.  
  4828.       DateTime   = (* a character string 20 characters long *)
  4829.                        (* SEAdog format Mon  1 Jan 86 02:34 *)
  4830.                    DayOfWk " " DayOfMo " " Month " " Year "
  4831.                    " HH ":" MM Null
  4832.  
  4833.       DayOfWeek  = "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun"
  4834.       DayOfMon   = " 1" | " 2" | " 3" | ... | "31"  (* blank fill *)
  4835.  
  4836. ===CHOP===
  4837.  
  4838. Coridon Henshaw
  4839.  
  4840. Sirrus| /
  4841.     --*--
  4842.     / |Software
  4843.  
  4844. ...Taco Bell is not a Mexican phone company.
  4845.  
  4846. --- GEcho 1.00
  4847.  * Origin: TCS Concordia - Mail Only - Toronto, Ontario (1:250/820)
  4848.  
  4849.  
  4850. ------------------------------------------------------------------------
  4851.   The QuickBASIC Scrapbook                                  
  4852.                                                             
  4853.   Vol 1, Issue 1                                            January 1993
  4854. ------------------------------------------------------------------------
  4855. ════════════════════════════════════════════════════════════════════════════════
  4856.  Area:    QuickBasic
  4857.   Msg:    #4365
  4858.  Date:    12-17-92 20:50 (Public) 
  4859.  From:    STEVE DEMO               
  4860.  To:      ANDY C. OLIVER           
  4861.  Subject: DIRECTORY TREE           
  4862. ────────────────────────────────────────────────────────────────────────────────
  4863.  -=> Quoting Andy C. oliver to Steve Demo <=-
  4864.  
  4865.  ACo> You might try a Library, such as Tom Hanlin's PBCLONE.  PBCLONE17 is
  4866.  ACo> the latest to date (as far as I know), and it has such routines.  As
  4867.  ACo> do many other good libraries.
  4868.  ACo> ACO
  4869.  
  4870.  Hello,
  4871.  
  4872.  I have used Pbclone before just was curious if QB could do it by it's self.
  4873.  I would like to learn all about QB with out useing any libarys. But I did
  4874.  get some code to do it . This was Given to me By Rick Cooper. 
  4875.  
  4876.  ==========================<cut here>========================================
  4877. DECLARE FUNCTION CurrentDir$ ()        
  4878.  
  4879. FUNCTION CurrentDir$
  4880. DEFSNG A-Z
  4881. DIM InRegs AS RegTypeX, OutRegs AS RegTypeX
  4882. '====================================================================
  4883. ' This Function Will Return The Current Path With A Complete Path Spec
  4884. ' Including Drive And Trailing "\"
  4885. ' If You Don't Want The trailing "\" Then Use A Left$ Statement To
  4886. 'Remove It... E.G. Dir$ = Left$(CurrentDir$,Len(CurrentDir$) - 1)
  4887. '===================================================================
  4888.  
  4889. InRegs.ax = &H1900                         'Use Dos Function To Get
  4890. CALL INTERRUPTX(&H21, InRegs, OutRegs)     'Current Drive
  4891. drive% = (OutRegs.ax AND &HFF) + 1         'Function Returns 0 Based
  4892.                                            'Drive Number And Next
  4893.                                            'Function needs A 1 Based
  4894.                                            'Number So We Add 1 To Result
  4895.  
  4896. drive$ = CHR$(64 + drive%)                 'Create String Representation
  4897.                                            'In Uppercase, Of Current
  4898.                                            'Drive Number
  4899.  
  4900. DIRECTORY$ = SPACE$(64)                    'Create Scratch Buffer
  4901.  
  4902. InRegs.ax = (256 * &H47) + 0               'Load Function Number
  4903. InRegs.dx = (256 * 0) + drive%             'Load Drive Number
  4904. InRegs.ds = VARSEG(DIRECTORY$)             'Pointer To A 64 Byte
  4905. InRegs.si = SADD(DIRECTORY$)               'Scratch Buffer
  4906. CALL INTERRUPTX(&H21, InRegs, OutRegs)     'Call Dos Int. 21 Func. 47
  4907.  
  4908. spot = INSTR(DIRECTORY$, CHR$(0))          'Function Returns An ASCIIZ
  4909. IF spot <> 0 THEN                          'String And We Don't Want The
  4910.   DIRECTORY$ = LEFT$(DIRECTORY$, spot - 1) 'Terminating Null Character
  4911. END IF                                     'So This Removes It And
  4912.                                            'Trailing Spaces
  4913.  
  4914. IF LEN(DIRECTORY$) > 1 THEN                'If It Isn't The Root Then
  4915.                                            'We Add A Trailing "\"
  4916.  
  4917. CurrentDir$ = drive$ + ":\" + DIRECTORY$ + "\"
  4918.  
  4919. ELSE                                       'If It Is The Root We Don't
  4920. CurrentDir$ = drive$ + ":\" + RTRIM$(LTRIM$(DIRECTORY$))
  4921. END IF                                     'Done!
  4922.  
  4923.  
  4924. END FUNCTION
  4925.  
  4926.  
  4927. ========================<cut here>==========================================
  4928.  
  4929. Just thought I would share what was given to me.
  4930.  
  4931.  
  4932.                                                 Take it easy,
  4933.  
  4934.                                                 Steve Demo
  4935.  
  4936.  
  4937. ... Pardon Me, But Would You Have Any Blue Poupon?  
  4938. --- Blue Wave/QBBS v2.11 [NR]
  4939.  * Origin: Just For The Heck Of It II   -=(Fort Wayne In)=- (1:236/16.0)
  4940.  
  4941.  
  4942. ------------------------------------------------------------------------
  4943.   The QuickBASIC Scrapbook                                  
  4944.                                                             
  4945.   Vol 1, Issue 1                                            January 1993
  4946. ------------------------------------------------------------------------
  4947. ════════════════════════════════════════════════════════════════════════════════
  4948.  Area:    QuickBasic
  4949.   Msg:    #8229
  4950.  Date:    12-21-92 15:43 (Public) 
  4951.  From:    TONY ELLIOTT             
  4952.  To:      STEVE PERRY              
  4953.  Subject: FCB's                    
  4954. ────────────────────────────────────────────────────────────────────────────────
  4955. Steve,
  4956.  
  4957.  SP> This is probably a dumb question, but here it goes. I need to get the
  4958.  SP> size of a file. I'm currently doing a shell command and directing it
  4959.  SP> to a file that I open and then search for the needed data. I was
  4960.  SP> looking through a interrupts book and it shows that interrupt 21h with
  4961.  SP> ah = 23h and ds:dx = pointer to an unopened file control block. Can
  4962.  SP> this be done in PDS? If so how? How do you access a FCB anyway?
  4963.  SP> Any and all help would be appreciated!
  4964.  
  4965. The easiest way is to open the file for input and look at LOF:
  4966.  
  4967.     OPEN "ThisFile.Dat" FOR INPUT AS #1
  4968.     Length& = LOF(1)
  4969.     CLOSE #1
  4970.  
  4971. If you are going to use an interrupt call instead, I'd recommend the
  4972. Find First function (4Eh) instead. That'll load the DTA area with 
  4973. with the file length, date, time, and attribute. Such code could be
  4974. easily modified to get directory names, volume labels, and even to load
  4975. an array with a list of files based on a filespec. Here's some code to
  4976. get some info about a specific file. You'll need to load the standard
  4977. QBX.QLB when starting the IDE. If you are using QB4.x instead, change
  4978. the $INCLUDE to "QB.BI":
  4979.  
  4980. DEFINT A-Z
  4981. REM $INCLUDE: 'QBX.BI'
  4982. TYPE Dta
  4983.     Dummy1  AS STRING * 21
  4984.     Attr    AS STRING * 1
  4985.     FTime   AS INTEGER
  4986.     FDate   AS INTEGER
  4987.     FLen    AS LONG
  4988.     FilName AS STRING * 13
  4989. END TYPE
  4990.  
  4991. FUNCTION FileInfo% (FileName$, FilDate$, FilTime$, Attr%, Length&)
  4992.  
  4993.     DIM LclDta AS Dta, Reg AS RegTypeX
  4994.     DIM TempFil AS STRING * 68
  4995.  
  4996.     'Get the current DTA address and save it.
  4997.     Reg.AX = &H2F00
  4998.     CALL InterruptX(&H21, Reg, Reg)
  4999.     OldDtaSeg = Reg.ES
  5000.     OldDtaOfs = Reg.BX
  5001.  
  5002.     'Change the DTA to avoid screwing up any work BASIC may be
  5003.     'doing when this function was invoked (DIR$, for example).
  5004.     Reg.AX = &H1A00
  5005.     Reg.DS = VARSEG(LclDta)             'Point DTA to our structure
  5006.     Reg.DX = VARPTR(LclDta)
  5007.     CALL InterruptX(&H21, Reg, Reg)
  5008.  
  5009.     'We use a fixed-length string to hold an ASCIZ copy of the file
  5010.     ' name. We don't use a convention string because then the code
  5011.     ' would have to be customized for QB/PDS/VBDOS. This way, one
  5012.     ' version works with all.
  5013.  
  5014.     TempFil = FileName$ + CHR$(0)
  5015.  
  5016.     Reg.AX = &H4E00                     'Find First
  5017.     Reg.CX = 32                         'Normal and "archive" files
  5018.     Reg.DS = VARSEG(TempFil)            'Address of our FL ASCIZ string
  5019.     Reg.DX = VARPTR(TempFil)
  5020.     CALL InterruptX(&H21, Reg, Reg)
  5021.  
  5022.     IF Reg.Flags AND 1 THEN
  5023.         Status% = Reg.AX
  5024.     ELSE
  5025.         Status% = 0
  5026.         Yr$ = LTRIM$(STR$((PEEK(VARPTR(LclDta.FDate) + 1) AND &HFE) \ 2 + 
  5027. 1980))
  5028.         Mon$ = LTRIM$(STR$((LclDta.FDate AND &H1E0) \ 32))
  5029.         Dy$ = LTRIM$(STR$(LclDta.FDate AND &H1F))
  5030.         FileDate$ = Mon$ + "/" + Dy$ + "/" + Yr$
  5031.         Sec$ = LTRIM$(STR$((LclDta.FTime AND &H1F) * 2))
  5032.         Min$ = LTRIM$(STR$((LclDta.FTime AND &H7E0) \ 32))
  5033.         Hr$ = LTRIM$(STR$((PEEK(VARPTR(LclDta.FTime) + 1) AND &HF8) \ 8))
  5034.         FileTime$ = Hr$ + ":" + Min$ + ":" + Sec$
  5035.         Attr = ASC(LclDta.Attr)
  5036.         Length& = LclDta.FLen
  5037.     END IF
  5038.  
  5039.     Reg.AX = &H1A00                     'Restore the old DTA address
  5040.     Reg.DS = OldDtaSeg
  5041.     Reg.DX = OldDtaOfs
  5042.     CALL InterruptX(&H21, Reg, Reg)
  5043.  
  5044. END FUNCTION
  5045.  
  5046. To use it, just:
  5047.  DECLARE FUNCTION FileInfo%(FileName$, FilDate$, FilTime$, Attr%, Length&)
  5048.  Status% = FileInfo%("\AUTOEXEC.BAT", FilDate$, FilTime$, Attr%, Length&)
  5049.  IF Status% THEN 
  5050.     PRINT "DOS Error";Status%;"occurred!"
  5051.  ELSE
  5052.     PRINT FilDate$,FilTime$,FilAttr%,Length&
  5053.  END IF
  5054.  
  5055. --- Blue Wave/Max v2.10 [NR]
  5056.  * Origin: Oakland BBS - McDonough, GA - (404) 954-0071 (1:133/706.0)
  5057.  
  5058.  
  5059. ------------------------------------------------------------------------
  5060.   The QuickBASIC Scrapbook                                  
  5061.                                                             
  5062.   Vol 1, Issue 1                                            January 1993
  5063. ------------------------------------------------------------------------
  5064. ════════════════════════════════════════════════════════════════════════════════
  5065.  Area:    QuickBasic
  5066.   Msg:    #5565
  5067.  Date:    12-24-92 15:38 (Public) 
  5068.  From:    LUIS ESPINOZA            
  5069.  To:      JEFFERY FOY              
  5070.  Subject: 4DOS and detecting it    
  5071. ────────────────────────────────────────────────────────────────────────────────
  5072. On (21 Dec 92) Jeffery Foy wrote to All...
  5073.  
  5074.  JF> I'd like to add 4DOS support in a program that I'm writing. How can
  5075.  JF> you 
  5076.  JF> detect it from BASIC? Is there a special call or something? I thought 
  5077.  JF> about just looking for 4DOS.COM in the PATH but that seems a bit
  5078.  JF> tacky.
  5079.  JF> 
  5080.  
  5081.         Try something like:
  5082.  
  5083.           a$=Environ$("COMSPEC")
  5084.           if instr(a$,"4DOS") then FFos=1 else FFos=0
  5085.  
  5086.                                         Luis
  5087.  
  5088.  
  5089. --- PPoint 1.33
  5090.  * Origin: The Rubber Room (1:207/213.5)
  5091.  
  5092.  
  5093. ------------------------------------------------------------------------
  5094.   The QuickBASIC Scrapbook                                  
  5095.                                                             
  5096.   Vol 1, Issue 1                                            January 1993
  5097. ------------------------------------------------------------------------
  5098. ════════════════════════════════════════════════════════════════════════════════
  5099.  Area:    QuickBasic
  5100.   Msg:    #6645
  5101.  Date:    12-27-92 12:27 (Public) 
  5102.  From:    DIK COATES               
  5103.  To:      CORIDON HENSHAW          
  5104.  Subject: scroll part 1 of 3       
  5105. ────────────────────────────────────────────────────────────────────────────────
  5106.  >>>> QUOTING Coridon Henshaw to Dik Coates <<<<
  5107.  
  5108.  DC> You talkin' text mode, or graphics mode... Text mode, I have a series
  5109.  DC> of routines I will upload if you want...
  5110.  CH> I'd like to see that.  Both upward and downward, please ;>
  5111.  
  5112. Here goes... Will set it up in three chunks...
  5113.  
  5114. The first file converts a normal ASCII file to one that can be read
  5115. as a binary file.
  5116.  
  5117. - - - - - - - - - - - -  Cut on Dashed Line - - - - - - - - - - - - -
  5118.  
  5119. DECLARE FUNCTION FILEEXIST% (filename$)
  5120. DECLARE SUB CommandLine (narg%, arg$())
  5121.  
  5122.   REDIM arg$(32)
  5123.   CALL CommandLine(narg%, arg$())
  5124.   CLS
  5125.  
  5126.  
  5127.   IF narg% <> 0 THEN
  5128.     REDIM PRESERVE arg$(narg%)
  5129.  
  5130.     IF narg% > 2 THEN
  5131.       LOCATE 12, 25
  5132.       PRINT "Too many arguments on Command Line"
  5133.       LOCATE 23, 21
  5134.       PRINT ">>>>>  Press Any Key to Exit to DOS  <<<<<";
  5135.  
  5136.       DO
  5137.         a$ = INKEY$
  5138.       LOOP UNTIL LEN(a$)
  5139.  
  5140.       CLS
  5141.       END
  5142.     END IF
  5143.  
  5144.     IF narg% < 2 THEN
  5145.       LOCATE 12, 25
  5146.       PRINT "Insufficient arguments on Command Line"
  5147.       LOCATE 23, 21
  5148.       PRINT ">>>>>  Press Any Key to Exit to DOS  <<<<<";
  5149.  
  5150.       DO
  5151.         a$ = INKEY$
  5152.       LOOP UNTIL LEN(a$)
  5153.  
  5154.       CLS
  5155.       END
  5156.     END IF
  5157.  
  5158.     IF NOT FILEEXIST%(arg$(1)) THEN
  5159.       LOCATE 12, 25
  5160.       PRINT "Text File does not Exist"
  5161.       LOCATE 23, 21
  5162.       PRINT ">>>>>  Press Any Key to Exit to DOS  <<<<<";
  5163.  
  5164.       DO
  5165.         a$ = INKEY$
  5166.       LOOP UNTIL LEN(a$)
  5167.  
  5168.       CLS
  5169.       END
  5170.     ELSE
  5171.       filenum1% = FREEFILE
  5172.       OPEN arg$(1) FOR INPUT AS #filenum1%
  5173.       filenum2% = FREEFILE
  5174.       OPEN arg$(2) FOR BINARY AS #filenum2%
  5175.  
  5176.       DO WHILE NOT EOF(filenum1%)
  5177.         LINE INPUT #filenum1%, strdummy$
  5178.         count% = count% + 1
  5179.       LOOP
  5180.  
  5181.       CLOSE #filenum1%
  5182.       PUT #filenum2%, , count%
  5183.  
  5184.       filenum1% = FREEFILE
  5185.       OPEN arg$(1) FOR INPUT AS #filenum1%
  5186.  
  5187.       FOR c% = 1 TO count%
  5188.         LINE INPUT #filenum1%, strdummy$
  5189.         lendummy% = LEN(strdummy$)
  5190.         PUT #filenum2%, , lendummy%
  5191.         PUT #filenum2%, , strdummy$
  5192.       NEXT c%
  5193.  
  5194.     END IF
  5195.   ELSE
  5196.     CLS
  5197.     LOCATE 12, 25
  5198.     PRINT "USAGE:  FASC2BIN textfile binfile"
  5199.     LOCATE 23, 21
  5200.     PRINT ">>>>>  Press Any Key to Exit to DOS  <<<<<";
  5201.  
  5202.     DO
  5203.       a$ = INKEY$
  5204.     LOOP UNTIL LEN(a$)
  5205.   END IF
  5206.  
  5207.   CLS
  5208.   END
  5209.  
  5210. - - - - - - - - - - - -  Cut on Dashed Line - - - - - - - - - - - - -
  5211.  
  5212. ... That tagline is TRUE ->  <- That tagline is FALSE
  5213. ___ Blue Wave/QWK v2.10
  5214.  
  5215. --- Maximus 2.00
  5216.  * Origin: Durham Systems (ONLINE!) (1:229/110)
  5217.  
  5218.  
  5219. ------------------------------------------------------------------------
  5220.   The QuickBASIC Scrapbook                                  
  5221.                                                             
  5222.   Vol 1, Issue 1                                            January 1993
  5223. ------------------------------------------------------------------------
  5224. ════════════════════════════════════════════════════════════════════════════════
  5225.  Area:    QuickBasic
  5226.   Msg:    #6646
  5227.  Date:    12-27-92 12:27 (Public) 
  5228.  From:    DIK COATES               
  5229.  To:      CORIDON HENSHAW          
  5230.  Subject: scroll part 2 of 3       
  5231. ────────────────────────────────────────────────────────────────────────────────
  5232. This is the second bunch.... of 3
  5233.  
  5234. It has routines used with the first listing...
  5235.  
  5236. - - - - - - - - - - - - - -  Cut on Dashed Line - - - - - - - - - - -
  5237.  
  5238.  
  5239. '************************************************************ SUB CommandLine
  5240. '
  5241. ' Procedure returns command line arguments.  Arguments must be separated by
  5242. ' spaces, tabs, or "/".  A maximum of 32 arguments can be returned in a
  5243. ' array.  The array must be declared as a dynamic array from the calling
  5244. ' program.
  5245. '
  5246. ' ARG:  NUL
  5247. ' RET:  narg%   - number of arguments on the command line
  5248. '       arg$()  - string array listing arguments
  5249. ' COMP: MS BASIC 7.1
  5250. ' REV:  91-10-28 header format
  5251. '
  5252. '****************************************************************************
  5253. '
  5254. SUB CommandLine (narg%, arg$())
  5255.  
  5256.   cl$ = COMMAND$
  5257.   l% = LEN(cl$)
  5258.  
  5259.   FOR c% = 1 TO l%
  5260.     temp$ = MID$(cl$, c%, 1)
  5261.  
  5262.     IF temp$ = " " OR temp$ = CHR$(9) OR temp$ = "/" THEN
  5263.       flag% = 0
  5264.     ELSE
  5265.       IF NOT flag% THEN
  5266.         narg% = narg% + 1
  5267.         flag% = -1
  5268.       END IF
  5269.  
  5270.       arg$(narg%) = arg$(narg%) + UCASE$(temp$)
  5271.     END IF
  5272.   NEXT c%
  5273.  
  5274. END SUB' CommandLine
  5275.  
  5276. '******************************************************** FUNCTION FILEEXIST%
  5277. '
  5278. ' Procedure determines if a file exists.  If file exists, then a -1 is
  5279. ' returned, otherwise a 0 is returned.  Procedure avoids using ON ERROR call.
  5280. '
  5281. ' CALL: FILEEXIST% (filename$)
  5282. '
  5283. ' ARG:  filename$ - full path and filename of file to be tested
  5284. '
  5285. ' COMP: MS Basic 7.1
  5286. '
  5287. ' REV:  91-10-30
  5288. '
  5289. '****************************************************************************
  5290. '
  5291. FUNCTION FILEEXIST% (filename$)
  5292.  
  5293.   FILEEXIST% = -1
  5294.  
  5295.   IF LEN(DIR$(filename$)) = 0 THEN
  5296.     FILEEXIST% = 0
  5297.   END IF
  5298.  
  5299. END FUNCTION
  5300.  
  5301.  
  5302.  
  5303.  
  5304.  
  5305.  
  5306. '******************************************************** SUBPROGRAM ScrollDn
  5307. '
  5308. '   Procedure scrolls the display window specified by the top and bottom rows
  5309. '   and the left and right columns down by a number of declared rows.  The
  5310. '   space left behind is changed to the colour attribute of the background.
  5311. '
  5312. '   CALL:   ScrollDn (trow%, icol%, brow%, fcol%, numrow%, bga%)
  5313. '
  5314. '   ARG:  trow%   =   top row of window to be scrolled
  5315. '         icol%   =   initial column of window
  5316. '         brow%   =   bottom row of window
  5317. '         fcol%   =   final column of window
  5318. '         numrow% =   number of rows to be scrolled down
  5319. '         bga%    =   background colour attribute
  5320. '
  5321. '   USES: Interrupt()
  5322. '
  5323. '   COMP: MS Basic 7.1
  5324. '
  5325. '   LIB:  DOS.LIB/QLB
  5326. '
  5327. '   REV:  91-11-13
  5328. '
  5329. '****************************************************************************
  5330. '
  5331. SUB ScrollDn (trow%, icol%, brow%, fcol%, numrow%, bga%)
  5332.  
  5333.   DIM InReg AS RegType, OutReg AS RegType
  5334.  
  5335.   tr% = trow% - 1
  5336.   ic% = icol% - 1
  5337.   br% = brow% - 1
  5338.   fc% = fcol% - 1
  5339.   temp% = bga%
  5340.  
  5341.   IF temp% < 0 OR temp% > 15 THEN
  5342.     temp% = 0
  5343.   END IF
  5344.  
  5345.   temp% = temp% * 16
  5346.   InReg.ax = 1792 + numrow%
  5347.   InReg.bx = temp% * 256
  5348.   InReg.cx = tr% * 256 + ic%
  5349.   InReg.dx = br% * 256 + fc%
  5350.   CALL Interrupt(&H10, InReg, OutReg)
  5351.  
  5352. END SUB 'ScrollDn
  5353.  
  5354.  
  5355.  
  5356.  
  5357. '******************************************************** SUBPROGRAM ScrollUp
  5358. '
  5359. '   Procedure scrolls the display window specified by the top and bottom rows
  5360. '   and the left and right columns up by a number of declared rows.  The
  5361. '   space left behind is changed to the colour attribute of the background.
  5362. '
  5363. '   CALL:   ScrollUp (trow%, icol%, brow%, fcol%, numrow%, bga%)
  5364. '
  5365. '   ARG:  trow%   =   top row of window to be scrolled
  5366. '         icol%   =   initial column of window
  5367. '         brow%   =   bottom row of window
  5368. '         fcol%   =   final column of window
  5369. '         numrow% =   number of rows to be scrolled up
  5370. '         bga%    =   background colour attribute
  5371. '
  5372. '   USES:   Interrupt()
  5373. '
  5374. '   COMP:   MS Basic 7.1
  5375. '
  5376. '   LIB:    DOS.LIB/QLB
  5377. '
  5378. '   REV:   91-11-13
  5379. '
  5380. '****************************************************************************
  5381. '
  5382. SUB ScrollUp (trow%, icol%, brow%, fcol%, numrow%, bga%)
  5383.  
  5384.   DIM InReg AS RegType, OutReg AS RegType
  5385.  
  5386.   tr% = trow% - 1
  5387.   ic% = icol% - 1
  5388.   br% = brow% - 1
  5389.   fc% = fcol% - 1
  5390.   temp% = bga%
  5391.  
  5392.   IF temp% < 0 OR temp% > 15 THEN
  5393.     temp% = 0
  5394.   END IF
  5395.  
  5396.   temp% = temp% * 16
  5397.   InReg.ax = 1536 + numrow%
  5398.   InReg.bx = temp% * 256
  5399.   InReg.cx = tr% * 256 + ic%
  5400.   InReg.dx = br% * 256 + fc%
  5401.   CALL Interrupt(&H10, InReg, OutReg)
  5402.  
  5403. END SUB 'ScrollUp
  5404.  
  5405.  
  5406.  
  5407. - - - - - - - - - - - - - -  Cut on Dashed Line - - - - - - - - - - -
  5408.  
  5409. ... Thesaurus: An ancient reptile with an excellent vocabulary.
  5410. ___ Blue Wave/QWK v2.10
  5411.  
  5412. --- Maximus 2.00
  5413.  * Origin: Durham Systems (ONLINE!) (1:229/110)
  5414.  
  5415.  
  5416. ------------------------------------------------------------------------
  5417.   The QuickBASIC Scrapbook                                  
  5418.                                                             
  5419.   Vol 1, Issue 1                                            January 1993
  5420. ------------------------------------------------------------------------
  5421. ════════════════════════════════════════════════════════════════════════════════
  5422.  Area:    QuickBasic
  5423.   Msg:    #6647
  5424.  Date:    12-27-92 12:27 (Public) 
  5425.  From:    DIK COATES               
  5426.  To:      CORIDON HENSHAW          
  5427.  Subject: scroll part 3 of 3       
  5428. ────────────────────────────────────────────────────────────────────────────────
  5429. This is the last of the installments... Part 3 of 3
  5430.  
  5431.  
  5432. - - - - - - - - - - - -  Cut on Dashed Line - - - - - - - - - - - - -
  5433.  
  5434. '****************************************************** SUBPROGRAM ScrollText
  5435. '
  5436. ' Procedure prints to screen WARNING MESSAGES returned from the various
  5437. ' program screens.  The messages if greater in number than the permitted
  5438. ' number of lines on the screen can be scrolled down and up for viewing.
  5439. '
  5440. ' CALL:   ScrollText (a$(), srow%, scol%, frow%, fcol%, txtfga%, txtbga%,
  5441. '                     tartln%)
  5442. '
  5443. ' ARG:  a$()    -   text array to be printed to screen
  5444. '       srow%   -   start row of the active screen area
  5445. '       scol%   -   start column of the active screen area
  5446. '       frow%   -   end row of the active screen area
  5447. '       fcol%   -   end column of the active screen area
  5448. '       txtfga% -   text foreground attribute
  5449. '       txtbga% -   text background attribute
  5450. '       startln%-   starting line of the text array to be printed
  5451. '
  5452. ' USES: ClearScrollText()
  5453. '       ScrollDn()
  5454. '       ClearScrollLine()
  5455. '       ScrollUp()
  5456. '
  5457. ' COMP: MS Basic 7.1
  5458. '
  5459. ' REV:  91-03-23
  5460. '       91-11-14  header revised
  5461. '
  5462. '****************************************************************************
  5463. '
  5464. SUB ScrollText (a$(), srow%, scol%, frow%, fcol%, textfga%, textbga%, 
  5465. startln%)
  5466.  
  5467.   COLOR textfga%, textbga%
  5468.   scrwidth% = fcol% - scol% + 1
  5469.   linesperscreen% = frow% - srow% + 1  'OK
  5470.   lenoffile% = UBOUND(a$, 1)  'OK
  5471.  
  5472.   IF linesperscreen% >= lenoffile% THEN                      'single screen
  5473.     CALL ClearScrollText(srow%, scol%, frow%, fcol%, textfga%, textbga%)
  5474.  
  5475.     FOR c% = 1 TO lenoffile%                                'print screen
  5476.       LOCATE srow% - 1 + c%, scol%
  5477.       PRINT a$(c%);
  5478.     NEXT c%
  5479.  
  5480.     DO                                 'exit single screen on escape only
  5481.       DO
  5482.         key$ = INKEY$
  5483.       LOOP UNTIL LEN(key$)
  5484.  
  5485.       IF LEN(key$) = 2 THEN
  5486.         BEEP
  5487.       ELSEIF LEN(key$) = 1 THEN
  5488.         IF ASC(key$) = 27 THEN
  5489.           EXIT SUB
  5490.         ELSE
  5491.           BEEP
  5492.         END IF
  5493.       END IF
  5494.     LOOP
  5495.   ELSE                                                    'multiple screens
  5496.     maxtoprow% = lenoffile% - linesperscreen% + 1 'OK initialize
  5497.  
  5498.     IF startln% + linesperscreen% > lenoffile% THEN
  5499.       oldtoprow% = maxtoprow%
  5500.       oldbotrow% = lenoffile%
  5501.     ELSE
  5502.       oldtoprow% = startln%
  5503.       oldbotrow% = startln% + linesperscreen% - 1
  5504.     END IF
  5505.  
  5506.     FOR c% = 1 TO linesperscreen%                           'print screen
  5507.       LOCATE srow% - 1 + c%, scol%
  5508.       PRINT a$(oldtoprow% - 1 + c%);
  5509.     NEXT c%
  5510.  
  5511.     DO
  5512.       DO
  5513.         key$ = INKEY$
  5514.       LOOP UNTIL LEN(key$)
  5515.  
  5516.       IF LEN(key$) = 2 THEN
  5517.         temp% = ASC(RIGHT$(key$, 1))
  5518.  
  5519.         SELECT CASE temp%
  5520.           CASE 71 'home
  5521.             scrollflag% = 0
  5522.             oldtoprow% = 1
  5523.             oldbotrow% = linesperscreen%
  5524.           CASE 72 AND oldbotrow% <= linesperscreen% 'cursor up
  5525.             scrollflag% = 2
  5526.           CASE 72 AND oldbotrow% > linesperscreen%
  5527.             scrollflag% = 1
  5528.             oldtoprow% = oldtoprow% - 1
  5529.             oldbotrow% = oldbotrow% - 1
  5530.           CASE 73 AND oldtoprow% <= linesperscreen% 'page up
  5531.             scrollflag% = 0
  5532.             oldtoprow% = 1
  5533.             oldbotrow% = linesperscreen%
  5534.           CASE 73 AND oldtoprow% > linesperscreen%
  5535.             scrollflag% = 0
  5536.             oldtoprow% = oldtoprow% - linesperscreen%
  5537.             oldbotrow% = oldbotrow% - linesperscreen%
  5538.           CASE 79 'end
  5539.             scrollflag% = 0
  5540.             oldtoprow% = maxtoprow%
  5541.             oldbotrow% = lenoffile%
  5542.           CASE 80 AND oldtoprow% < maxtoprow% 'cursor down
  5543.             scrollflag% = -1
  5544.             oldtoprow% = oldtoprow% + 1
  5545.             oldbotrow% = oldbotrow% + 1
  5546.           CASE 80 AND oldtoprow% = maxtoprow%
  5547.             scrollflag% = 2
  5548.           CASE 81 AND oldbotrow% >= maxtoprow%'page down
  5549.             scrollflag% = 0
  5550.             oldtoprow% = maxtoprow%
  5551.             oldbotrow% = lenoffile%
  5552.           CASE 81 AND oldbotrow% < maxtoprow%
  5553.             scrollflag% = 0
  5554.             oldtoprow% = oldtoprow% + linesperscreen%
  5555.             oldbotrow% = oldbotrow% + linesperscreen%
  5556.           CASE ELSE
  5557.             BEEP
  5558.         END SELECT
  5559.  
  5560.         IF scrollflag% = 1 THEN 'movement up
  5561.           CALL ScrollDn(srow%, scol%, frow%, fcol%, 1, textbga%)
  5562.           CALL ClearScrollLine(srow%, scol%, fcol%, textfga%, textbga%)
  5563.           LOCATE srow%, scol%
  5564.           PRINT a$(oldtoprow%);
  5565.         ELSEIF scrollflag% = -1 THEN 'movement down
  5566.           temp% = srow% + linesperscreen% - 1
  5567.           CALL ScrollUp(srow%, scol%, frow%, fcol%, 1, textbga%)
  5568.           CALL ClearScrollLine(temp%, scol%, fcol%, textfga%, textbga%)
  5569.           LOCATE temp%, scol%
  5570.           PRINT a$(oldbotrow%);
  5571.         ELSEIF scrollflag% = 0 THEN                     'print screen
  5572.           CALL ClearScrollText(srow%, scol%, frow%, fcol%, textfga%, textbga%)
  5573.  
  5574.           FOR c% = 1 TO linesperscreen%
  5575.             LOCATE srow% - 1 + c%, scol%
  5576.             PRINT a$(oldtoprow% - 1 + c%);
  5577.           NEXT c%
  5578.         END IF
  5579.  
  5580.         scrollflag% = 0
  5581.       ELSE
  5582.         temp% = ASC(key$)
  5583.  
  5584.         SELECT CASE temp%
  5585.           CASE 27 'escape
  5586.             EXIT SUB
  5587.           CASE ELSE
  5588.             BEEP
  5589.         END SELECT
  5590.       END IF
  5591.     LOOP
  5592.   END IF
  5593.  
  5594. END SUB 'ScrollText
  5595.  
  5596.  
  5597.  
  5598. '********************************************************* SUB TextFile2Array
  5599. '
  5600. ' The procedure copies a BINARY text file to a string array.  The format of
  5601. ' binary file is:  (size%, LENstring1%, string1$, LENstring2%, string2$,...)
  5602. ' Error handling must be done in the calling program.
  5603. '
  5604. ' CALL: TextFile2Array (filename$, a$())
  5605. '
  5606. ' ARG:  filename$ - name of the BINARY file to be copied
  5607. '
  5608. ' RET:  a$()      - string array containing contents of binary file
  5609. '
  5610. ' COMP: MS Basic 7.1
  5611. '
  5612. ' REV:  91-10-30
  5613. '
  5614. '****************************************************************************
  5615. '
  5616. SUB TextFile2Array (filename$, a$())
  5617.  
  5618.   filenum% = FREEFILE
  5619.   OPEN filename$ FOR BINARY AS filenum%
  5620.   GET filenum%, , size%
  5621.   REDIM a$(size%)
  5622.  
  5623.   FOR c% = 1 TO size%
  5624.     GET filenum%, , dummy%
  5625.     a$(c%) = INPUT$(dummy%, filenum%)
  5626.   NEXT c%
  5627.   CLOSE filenum%
  5628.  
  5629. END SUB' TextFile2Array
  5630.  
  5631. - - - - - - - - - - - -  Cut on Dashed Line - - - - - - - - - - - - -
  5632.  
  5633. It's possible to get a smooth scroll... one row of pixels at a time...
  5634. but only from graphics mode... I can provide code for this also... but
  5635. will take a bit to unravel it from an application... also, done in
  5636. assembly... the only way to do graphics... Regards Dik
  5637.  
  5638.  
  5639.  
  5640. ... AAAAA - American Association Against Acronym Abuse  
  5641. ___ Blue Wave/QWK v2.10
  5642.  
  5643. --- Maximus 2.00
  5644.  * Origin: Durham Systems (ONLINE!) (1:229/110)
  5645.  
  5646.  
  5647. ------------------------------------------------------------------------
  5648.   The QuickBASIC Scrapbook                                  
  5649.                                                             
  5650.   Vol 1, Issue 1                                            January 1993
  5651. ------------------------------------------------------------------------
  5652. ════════════════════════════════════════════════════════════════════════════════
  5653.  Area:    QuickBasic
  5654.   Msg:    #7266
  5655.  Date:    12-27-92 06:19 (Public) 
  5656.  From:    RICH GELDREICH           
  5657.  To:      ALL                      
  5658.  Subject: Bload Compressor/1       
  5659. ────────────────────────────────────────────────────────────────────────────────
  5660.     I'll get directly to the point: if you use BSAVE and BLOAD to 
  5661. compress SCREEN 13 images, then this program should be a great help. The 
  5662. purpose of this program is to compress SCREEN 13 (320x200x256) images to 
  5663. a BLOAD'able file. To decompress the file, you call a VERY FAST assembly 
  5664. language decompressor that quickly sets the palette and writes the image 
  5665. to the screen. It used to be small, until I documented it... Ooops.
  5666.  
  5667. 'Page 1 of ENCODE13.BAS begins here.
  5668. 'SCREEN 13 (320x200x256) Screen Compressor (SP1.BAS)
  5669. 'Public Domain By Rich Geldreich, December 26, 1992
  5670.  
  5671. 'Anyone  may  use this program in anything they want,  as long as the
  5672. 'original author(me,  duh)  is  given  credit  where credit is due...
  5673. 'Thanks.   I'd appreciate a little cash on the side if you  make  any
  5674. 'money  off a product that uses this program...   :-) If you make any
  5675. 'neat modifications/optimizations to this program or the ASM decoder,
  5676. 'I would really like to seem them!
  5677.  
  5678. 'Description:
  5679. '    This simple SCREEN 13  compression  program uses an LZ77 variant
  5680. 'to compress SCREEN 13 images.  A FAST assembly subroutine is used to
  5681. 'decompress the image back to the screen.    The  compression  should
  5682. 'always beat  PCX, and should come fairly close or beat out GIF under
  5683. 'most cases.
  5684. '
  5685. '    The assembly decompressor's  speed  is several magnitudes faster
  5686. 'than the quickest GIF decoder I've seen, VPIC 5.1. (Look how  simple
  5687. 'it  is  and  you'll know why!) BTW- The output stage of this program
  5688. 'was optimized for  decoding  speed,   not for compression.   Several
  5689. 'optimizations could be added to increase this program's  compression
  5690. 'performance,   such  as  entropy  encoding  on the distance & length
  5691. 'tokens(which would slow the decoder down immensely),  increasing the
  5692. 'sizes of the sliding dictionary and look ahead buffers,  and further
  5693. 'optimizing the  non-greedy  aspect  of  this  LZ77 implementation to
  5694. 'choose the best character/match combinations to store in the  output
  5695. 'stream.
  5696. '
  5697. '    The assembly subroutine is for 286's and  above,   only.    This
  5698. 'program does NOT work under QuickBASIC,  only PDS and VB/DOS because
  5699. 'of the use of BYVAL.
  5700. '
  5701. '    Any  questions,   cash/and  or  death   threats   call   me   at
  5702. '(609)-742-8752  2:30pm  -  11:30pm  eastern  time  or  send  a  self
  5703. 'addressed stamped evelope (SASE) to:
  5704. '
  5705. '                     Rich Geldreich
  5706. '                     410 Market St.
  5707. '                     Gloucester City, NJ 08030
  5708. '
  5709. 'Possible  uses of this program:  Use a GIF or PCX converter(or SHELL
  5710. 'out  to  VPIC)  to  display  the  image  you  want  to  use  in your
  5711. 'application on SCREEN 13.   Then encode the image with this program.
  5712. 'You  can  then  instantly  recall  the  image using the fast Decom13
  5713. 'assembly language subroutine.
  5714. DEFINT A-Z
  5715. 'Declaration  for  the assembly decompressor.   If the area of memory
  5716. 'passed does not start with  "RG",  the compressed image's signature,
  5717. 'then this routine will just return without  doing  anything.    This
  5718. 'prevents your machine from hanging when you pass it a bum pointer.
  5719. DECLARE SUB Decom13 (BYVAL InSegment, BYVAL InOffset)
  5720.  
  5721. CONST True = -1, False = 0
  5722. 'A larger buffer size would surely increase compression.
  5723. CONST BufferSize = 4096, HashSize = 4096
  5724. CONST Null = BufferSize, Threshold = 2, MaxMatch = 273
  5725. CONST MaxCompares = 300 'Controls compression ratio vs. speed
  5726.  
  5727. 'Arrays for LZ77 style compression with multiple linked lists
  5728. DIM SHARED RingBuffer((BufferSize + MaxMatch - 1) - 1)
  5729. DIM SHARED NextCell((BufferSize + HashSize + 1) - 1)
  5730. DIM SHARED LastCell((BufferSize + HashSize + 1) - 1)
  5731. 'Temp. holding buffer for compression tokens
  5732. DIM SHARED CodeBuffer(16 * 3 - 1)
  5733.  
  5734. 'Misc. stuff
  5735. DIM SHARED DoneFlag, xp, yp, xl, yl, xh, yh
  5736. DIM SHARED Match.Length, Match.Position, Match.Distance
  5737. DIM SHARED IOBuffer$, IOPointer
  5738. DIM SHARED CodePointer, CodeCounter, OrMask AS LONG, BitAccum AS LONG
  5739.  
  5740. SCREEN 13
  5741.  
  5742. '**COMPRESSION EXAMPLE**
  5743. RANDOMIZE TIMER
  5744. FOR a = 1 TO 100  'draw us some garbage
  5745.     x = RND * 319: y = RND * 199: c = RND * 255
  5746.     CIRCLE (x, y), RND * 60, c: PAINT (x, y), RND * 255, c
  5747. NEXT
  5748. FOR a = 1 TO 200: LINE -(RND * 319, RND * 199), RND * 255: NEXT
  5749. Compress13 "coolfile.bci" 'compress the screen to coolfile.bci
  5750.  
  5751. '**DECOMPRESSION EXAMPLE**
  5752. 'Allocate 64,000 bytes for a worst case scenario, decrease this of
  5753. 'course to match the image's compressed size in bytes...
  5754. 'Continued on page 2
  5755.  
  5756. --- MsgToss 2.0b
  5757.  * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
  5758.  
  5759.  
  5760. ------------------------------------------------------------------------
  5761.   The QuickBASIC Scrapbook                                  
  5762.                                                             
  5763.   Vol 1, Issue 1                                            January 1993
  5764. ------------------------------------------------------------------------
  5765. ════════════════════════════════════════════════════════════════════════════════
  5766.  Area:    QuickBasic
  5767.   Msg:    #7267
  5768.  Date:    12-27-92 06:20 (Public) 
  5769.  From:    RICH GELDREICH           
  5770.  To:      ALL                      
  5771.  Subject: Bload Compressor/2       
  5772. ────────────────────────────────────────────────────────────────────────────────
  5773. 'Page 2 of ENCODE13.BAS begins here.
  5774. REDIM image(32000): DEF SEG = VARSEG(image(0))
  5775. BLOAD "coolfile.bci", VARPTR(image(0)) 'Load the compressed data.
  5776.  
  5777. PRINT "Press a key to decompress.": B$ = INPUT$(1): SCREEN 13
  5778.  
  5779. 'Call the asm routine to decompress the image.
  5780. Decom13 VARSEG(image(0)), VARPTR(image(0)): B$ = INPUT$(1)
  5781.  
  5782. 'Compresses a SCREEN 13 image to a BLOADable file. Use the ASM sub
  5783. 'Decom13 to decompress the image back to the screen. This routine
  5784. 'currently crawls, because I didn't optimize it that much.
  5785. 'The entire palette is also saved to the compressed file,
  5786. SUB Compress13 (F$)
  5787.     OPEN F$ FOR OUTPUT AS #1: CLOSE : OPEN F$ FOR BINARY AS #1
  5788.     'Store the BLOAD header and image signature.
  5789.     a$ = CHR$(&HFD) + CHR$(0) + CHR$(&HA0) + STRING$(4, 0) + "RG"
  5790.     PUT #1, , a$
  5791.     'Initialize a 4k disk output buffer
  5792.     IOBuffer$ = SPACE$(4096): IOPointer = 1
  5793.     CodePointer = 0: CodeCounter = 0: OrMask = 1: BitAccum = 0
  5794.     'Write the screen's palette.
  5795.     OUT &H3C7, 0: FOR a = 0 TO 767: WriteByte INP(&H3C9): NEXT
  5796.  
  5797.     DoneFlag = False: xl = 0: yl = 0: xh = 319: yh = 199
  5798.     xp = xl: yp = yl 'coordinate of next point to compress
  5799.  
  5800.     InitRingBuffer   'clear the ring buffer
  5801.     InitLZ77         'initialize the linked list pool
  5802.     'prime the look ahead buffer
  5803.     S = 0: R = BufferSize - MaxMatch
  5804.     FOR LookAheadLength = 0 TO MaxMatch - 1
  5805.         IF DoneFlag THEN
  5806.             EXIT FOR
  5807.         ELSE
  5808.             RingBuffer(R + LookAheadLength) = GetPixel
  5809.         END IF
  5810.     NEXT
  5811.     'find first string
  5812.     FindString R
  5813.     DO
  5814.         'if match too small(less than 3 chars), the just output
  5815.         'a single character
  5816.         IF Match.Length <= Threshold THEN
  5817.             OutputChar RingBuffer(R): Last.Match.Length = 1
  5818.         ELSE
  5819.             'output a string match token
  5820.             Last.Match.Length = Match.Length
  5821.             'Send  the match's distance,  instead of its position in
  5822.             'the ring buffer, because the decompressor is not using a
  5823.             'ring buffer to store the decompressed data.
  5824.             Match.Distance = (R - Match.Position) AND (BufferSize - 1)
  5825.             OutputMatch
  5826.         END IF
  5827.         'prime the look ahead buffer with more characters
  5828.         FOR a = 0 TO Last.Match.Length - 1
  5829.             IF DoneFlag THEN EXIT FOR 'exit this loop if no more chars
  5830.             'delete string at S, then store a new char at S
  5831.             DeleteString S: RingBuffer(S) = GetPixel
  5832.             'keep a "ghost buffer" at the end of the ring buffer to
  5833.             'avoid using a logical AND on all of our buffer pointers
  5834.             IF S < (MaxMatch - 1) THEN
  5835.                 RingBuffer(S + BufferSize) = RingBuffer(S)
  5836.             END IF
  5837.             S = (S + 1) AND (BufferSize - 1)
  5838.             R = (R + 1) AND (BufferSize - 1)
  5839.             'if not last time through loop then just add string to the
  5840.             'linked list pool, otherwise add it and find a match
  5841.             '(this could be optimized so the IF/THEN conditional  is
  5842.             'removed from inside this loop)
  5843.             IF a = (Last.Match.Length - 1) THEN
  5844.                 FindString R
  5845.             ELSE
  5846.                 MakeString R
  5847.             END IF
  5848.         NEXT
  5849.         FOR a = a TO Last.Match.Length - 1
  5850.             'this loop is active when no more characters are available
  5851.             'from the input stream
  5852.             'Kill string at S, not sure if this is needed because
  5853.             'we're  not  storing any characters in its place. I see
  5854.             'no reason to do it,   but  this  is one of those little
  5855.             'quirks that all LZSS implementations I've seen have... ?
  5856.  
  5857.             DeleteString S
  5858.             S = (S + 1) AND (BufferSize - 1)
  5859.             R = (R + 1) AND (BufferSize - 1)
  5860.             LookAheadLength = LookAheadLength - 1
  5861.             IF LookAheadLength THEN
  5862.                 IF a = (Last.Match.Length - 1) THEN
  5863.                     FindString R
  5864.                 ELSE
  5865. 'Continued on page 3
  5866.  
  5867. --- MsgToss 2.0b
  5868.  * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
  5869.  
  5870.  
  5871. ------------------------------------------------------------------------
  5872.   The QuickBASIC Scrapbook                                  
  5873.                                                             
  5874.   Vol 1, Issue 1                                            January 1993
  5875. ------------------------------------------------------------------------
  5876. ════════════════════════════════════════════════════════════════════════════════
  5877.  Area:    QuickBasic
  5878.   Msg:    #7268
  5879.  Date:    12-27-92 06:21 (Public) 
  5880.  From:    RICH GELDREICH           
  5881.  To:      ALL                      
  5882.  Subject: Bload Compressor/3       
  5883. ────────────────────────────────────────────────────────────────────────────────
  5884. 'Page 3 of ENCODE13.BAS begins here.
  5885.                     MakeString R
  5886.                 END IF
  5887.  
  5888.                 'Limit  match  length  because the look ahead buffer
  5889.                 'is growing smaller.   This is another little oddity
  5890.                 'I've seen amoung the LZSS compressors,  they all do
  5891.                 'this check outside this  loop  before they output a
  5892.                 'character/match token...    There's  no  reason  to
  5893.                 'check  outside  the  loop because the string search
  5894.                 'function always  limits  the  match  length  to the
  5895.                 'look ahead buffer's size.   We only check when  the
  5896.                 'look ahead buffer starts to get smaller.
  5897.  
  5898.                 IF Match.Length > LookAheadLength THEN
  5899.                     Match.Length = LookAheadLength
  5900.                 END IF
  5901.             END IF
  5902.         NEXT
  5903.     LOOP WHILE LookAheadLength 'loop while still more chars to encode
  5904.     OutputEOF
  5905.     WriteFlush
  5906.     'get (compressed size)-header
  5907.     a& = LOF(1) - 7: SCREEN 0: WIDTH 80
  5908.     IF a& > 64000 THEN
  5909.         PRINT "Image could not be compressed."
  5910.         CLOSE #1: KILL F$
  5911.     ELSE
  5912.         PRINT "Image compressed to"; a&; "bytes."
  5913.         IF a& > 32767 THEN a& = a& - 65536
  5914.         'store the compressed size so BLOAD loads everything in
  5915.         a = a&: PUT #1, 6, a: CLOSE #1
  5916.     END IF
  5917. END SUB
  5918.  
  5919. 'Deletes the string at S from the linked list pool.
  5920. SUB DeleteString (BYVAL S)
  5921.     NextCell = NextCell(S): LastCell = LastCell(S)
  5922.     NextCell(LastCell) = NextCell: LastCell(NextCell) = LastCell
  5923.     NextCell(S) = Null
  5924. END SUB
  5925.  
  5926. 'Attempts to find a match at R+1 that is larger than the match found
  5927. 'at R, to get rid of some of the encoder's "greedy" characteristics.
  5928. FUNCTION FindAlternate (BYVAL R, BYVAL MatchLength)
  5929.     B1 = RingBuffer(R): B2 = RingBuffer(R + 1): B3 = RingBuffer(R + 2)
  5930.     'hash out the first three characters of the string to locate
  5931.     P = (BufferSize + 1) + ((B1 * 14096& XOR B2 * 77 XOR B3) MOD _
  5932. HashSize)
  5933.     MatchChar = RingBuffer(R + MatchLength)
  5934.     FOR x = 1 TO MaxCompares
  5935.         P = NextCell(P) 'traverse linked list P for a match
  5936.         'if we struck bottom then search failed
  5937.         IF P = Null THEN FindAlternate = False: EXIT FUNCTION
  5938.         'compare string P to string R
  5939.         IF RingBuffer(P) = B1 AND RingBuffer(P + 1) = B2 AND RingBuffer_
  5940. (P + 2) = B3 AND RingBuffer(P + MatchLength) = MatchChar THEN
  5941.             FOR SearchLength = 3 TO (MaxMatch - 1) - 1
  5942.                 IF RingBuffer(R + SearchLength) <> RingBuffer(P + _
  5943. SearchLength) THEN EXIT FOR
  5944.             NEXT
  5945.             'if we find a longer match then exit with success
  5946.             IF SearchLength > MatchLength THEN FindAlternate = True: _
  5947. EXIT FUNCTION
  5948.         END IF
  5949.     NEXT
  5950.     FindAlternate = False
  5951. END FUNCTION
  5952.  
  5953. 'Attempts  to  locate  a  match  in the linked list pool for  R. Most
  5954. 'other LZ77/LZSS  implementations  I've  seen  use  a  binary tree to
  5955. 'locate string matches.   In this implementation,  I use  a  pool  of
  5956. 'linked  lists to locate strings.   Each linked list contains strings
  5957. 'which all  start  with the  same 3 characters. (Well, usually. Since
  5958. 'hash collisions can occur,  sometimes  a linked list contains two or
  5959. 'more different strings.   This isn't cool,  and can't be  eliminated
  5960. 'unless  another approach to collision handling is used.)
  5961. '
  5962. '    To locate a string,  its linked list is located through a simple
  5963. 'hashing formula(which was home brewed,  BTW,   so it may not be that
  5964. 'optimal),  and then each string in the list is compared against  our
  5965. 'target  string until we either find a string which matches perfectly
  5966. 'or the "bombout" variable is decremented to zero.   The bombout rate
  5967. 'defines the number of string  compares  which may be performed until
  5968. 'the algorithm stops searching and settles with what it  has.    This
  5969. 'decreases  compression  slightly,  but greatly increases compression
  5970. 'speed,  especially when  the  input  stream  contains  large runs of
  5971. 'repeated data.   (ARJ adjusts its bombout  rate  with  command  line
  5972. 'options:   options  -m4  to  -m0 vary the number of compares it does
  5973. 'against its string directionary,  therefore "dialing" in compression
  5974. 'speed  vs.    compression  ratio.    PKZIP  1.93a  does  this  also.
  5975. 'Normally, PKZIP 1.93a will set its bombout rate to 50 compares.  The
  5976. 'Continued on page 4
  5977.  
  5978. --- MsgToss 2.0b
  5979.  * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
  5980.  
  5981.  
  5982. ------------------------------------------------------------------------
  5983.   The QuickBASIC Scrapbook                                  
  5984.                                                             
  5985.   Vol 1, Issue 1                                            January 1993
  5986. ------------------------------------------------------------------------
  5987. ════════════════════════════════════════════════════════════════════════════════
  5988.  Area:    QuickBasic
  5989.   Msg:    #7269
  5990.  Date:    12-27-92 06:22 (Public) 
  5991.  From:    RICH GELDREICH           
  5992.  To:      ALL                      
  5993.  Subject: Bload Compressor/4       
  5994. ────────────────────────────────────────────────────────────────────────────────
  5995. 'Page 4 of ENCODE13.BAS begins here.
  5996. '-s option brings this down to 10-7 compares(can't remember exactly),
  5997. 'and  the -ex option increases the  bombout  rate  to  500  compares.
  5998. 'Obviously, the -ex option slows down PKZIP 1.93a  because it can  do
  5999. 'up to ten times more string compares than usual.)
  6000. '
  6001. '    One optimization that I have not seen anywhere yet speeds up the
  6002. 'string  search  by  skipping  strings which can't possibly be larger
  6003. 'than the largest string found up to that point...
  6004. '
  6005. '    For  instance,   let's  say we are searching for the string "the
  6006. 'president eats peanuts".   Let's  also  say  the largest match we've
  6007. 'found so far is "the president ", or 14 characters.  The next string
  6008. 'to  compare  against  our target is "the president finds coolness in
  6009. 'compression".  Since the whole point of searching is to look for the
  6010. 'largest match, there's no use in doing a whole string compare if the
  6011. 'match will be smaller/equal to  our current match.   A quick compare
  6012. 'of the character that must match for the match length to  be  larger
  6013. 'will  tell  us  if  the  string  *may* be larger.   If the character
  6014. 'matches,  we must do the compare.   If it doesn't,  then there is no
  6015. 'use in doing the string compare because the match cannot possibly be
  6016. 'longer.   Since the 15th character of our target string is "e",  and
  6017. 'the 15th character of our search string is "f",  it can instantly be
  6018. 'discarded because the  match  cannot  possibly  be  larger  than  14
  6019. 'characters.   This especially speeds up the search when large string
  6020. 'matches  are found in the input stream(such as in text files).   And
  6021. 'since the optimization is relatively trivial, it shouldn't slow down
  6022. 'the string search loop much  at  all  when  input stream is not very
  6023. 'compressable.
  6024. '
  6025. '   Finally,  using the linked list pool to find string matches makes
  6026. 'finding the  closest  AND  longest  match  very  simple(finding  the
  6027. 'closest  match  aids  entropy encoding in attaining more compression
  6028. 'because it can  favor  close  matches  over  far  ones).   Since new
  6029. 'strings are always inserted as the first string in its  pool,    the
  6030. 'entire  list is already sorted in order of distance from our current
  6031. 'position in the ring buffer.
  6032. SUB FindString (BYVAL R)
  6033.     B1 = RingBuffer(R): B2 = RingBuffer(R + 1): B3 = RingBuffer(R + 2)
  6034.     'hash the first 3 characters of the string to find
  6035.     LinkHead = (BufferSize + 1) + ((B1 * 14096& XOR B2 * 77 XOR B3) _
  6036. MOD HashSize)
  6037.     Match.Length = 0: MatchChar = B1: P = LinkHead
  6038.     FOR x = 1 TO MaxCompares 'MaxCompares is the bombout rate
  6039.         'traverse linked list P for match
  6040.         P = NextCell(P): IF P = Null THEN EXIT FOR
  6041.         'If first 3 characters match, and the character at
  6042.         'P+MatchLength=R+MatchLength, then compare strings.
  6043.         IF RingBuffer(P) = B1 AND RingBuffer(P + 1) = B2 AND RingBuffer_
  6044. (P + 2) = B3 AND RingBuffer(P + Match.Length) = MatchChar THEN
  6045.             FOR SearchLength = 3 TO (MaxMatch - 1) - 1
  6046.                 IF RingBuffer(R + SearchLength) <> RingBuffer(P + _
  6047. SearchLength) THEN EXIT FOR
  6048.             NEXT
  6049.             'if matchsize=maxmatch then take it and run
  6050.             '(MaxMatch-1) because our look ahead buffer is one
  6051.             'character longer than the maximum match length.
  6052.             IF SearchLength >= (MaxMatch - 1) THEN
  6053.                 Match.Length = (MaxMatch - 1)
  6054.                 Match.Position = P
  6055.                 EXIT FOR
  6056.             END IF
  6057.             'if we find a longer match then take it
  6058.             IF SearchLength > Match.Length THEN
  6059.                 Match.Length = SearchLength
  6060.                 Match.Position = P
  6061.                 MatchChar = RingBuffer(R + Match.Length)
  6062.             END IF
  6063.         END IF
  6064.     NEXT
  6065.     'make the new string the first entry in its linked list pool
  6066.     'so we always find the closest match
  6067.     a = NextCell(LinkHead): NextCell(LinkHead) = R
  6068.     LastCell(a) = R: LastCell(R) = LinkHead: NextCell(R) = a
  6069.     'Attempt to find a longer match at R+1. If there is a longer
  6070.     'match, then set the match length to zero so the current match
  6071.     'is ignored.
  6072.     IF (Match.Length <> 0) AND (Match.Length <> (MaxMatch - 1)) THEN
  6073.         IF FindAlternate(R + 1, Match.Length) THEN Match.Length = 0
  6074.     END IF
  6075. END SUB
  6076.  
  6077. 'Returns one pixel from the display.
  6078. FUNCTION GetPixel
  6079.     GetPixel = POINT(xp, yp): xp = xp + 1
  6080.     IF xp > xh THEN
  6081.         LINE (xl, yp)-(xh, yp), 0
  6082.         xp = xl: yp = yp + 1: DoneFlag = yp > yh
  6083.     END IF
  6084. END FUNCTION
  6085.  
  6086. 'Initializes the linked list pool arrays
  6087. 'Continued on page 5
  6088.  
  6089. --- MsgToss 2.0b
  6090.  * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
  6091.  
  6092.  
  6093. ------------------------------------------------------------------------
  6094.   The QuickBASIC Scrapbook                                  
  6095.                                                             
  6096.   Vol 1, Issue 1                                            January 1993
  6097. ------------------------------------------------------------------------
  6098.  
  6099.     That's it! Thank you for reading The QuickBASIC Scrapbook.
  6100.  
  6101.  
  6102.  
  6103.     Comments:
  6104.  
  6105.      Messages captured using Harvey Parisien's OFFLINE v1.50.
  6106.     
  6107.      The QuickBASIC Scrapbook is Copyright 1992 by Quauntum Software.
  6108.                            All Rights Reserved.
  6109.  
  6110.